Load libraries

library(readxl) # for reading in excel files
library(janitor) # data checks and cleaning
library(glue) # for easy pasting
library(FactoMineR) # for PCA
library(factoextra) # for PCA
library(rstatix) # for stats
library(pheatmap) # for heatmaps
library(plotly) # for interactive plots
library(htmlwidgets) # for saving interactive plots
library(devtools)
library(notame) # used for feature clustering
library(doParallel)
library(igraph) # feature clustering
library(ggpubr) # visualizations
library(knitr) # clean table printing
library(rmarkdown)
library(corrr)
library(ggcorrplot)
library(ggthemes)
library(ggtext)
library(PCAtools)
library(pathview) # for functional analysis and KEGG annotation
library(mixOmics) #multilevel PCA and sPLS-DA
library(tidyverse) # for everything

Read in data

# raw filtered metabolomics data 
omicsdata <- read_csv("features_post-data-filtering.csv") %>%
  clean_names()

# metadata
metadata <- read_csv("../../../metadata-new.csv")

# carotenoids data
carotenoids <- read_excel("../../../Plasma carot_ret_apo levels.xlsx",
                          sheet = "B1andB3") %>%
  clean_names()

Wrangle data

Metadata

carotenoids <- carotenoids %>%
  mutate(total_carotenoids = b_c_nmol_l_plasma + lyc_nmol_l_plasma + retinol_nmol_l_plasma + apo13one_nmol_l_plasma)

Feature data

# how many features
nrow(omicsdata)
## [1] 1043
# are there any duplicates?
omicsdata %>% get_dupes(mz_rt)
## # A tibble: 4 × 89
##   mz_rt          dupe_count row_id x5101_b1_control_c18…¹ x5105_b3_lyc_c18neg_21
##   <chr>               <int>  <dbl>                  <dbl>                  <dbl>
## 1 724.5276_8.3            2   2843                  4697.                  8713.
## 2 724.5276_8.3            2   2846                  4697.                  8713.
## 3 863.6765_10.6…          2   3900                 17536.                 12167.
## 4 863.6765_10.6…          2   3903                 17536.                 12167.
## # ℹ abbreviated name: ¹​x5101_b1_control_c18neg_82
## # ℹ 84 more variables: x5112_b1_beta_c18neg_34 <dbl>,
## #   x5107_b1_beta_c18neg_29 <dbl>, x5105_b1_lyc_c18neg_76 <dbl>,
## #   x5102_b1_control_c18neg_5 <dbl>, x5101_b3_control_c18neg_66 <dbl>,
## #   x5103_b1_lyc_c18neg_35 <dbl>, x5104_b3_lyc_c18neg_32 <dbl>,
## #   x5109_b3_beta_c18neg_81 <dbl>, x5104_b1_lyc_c18neg_10 <dbl>,
## #   x5108_b1_control_c18neg_71 <dbl>, x5113_b3_beta_c18neg_47 <dbl>, …
# remove dupes
omicsdata <- omicsdata %>% 
  distinct(mz_rt, .keep_all = TRUE)

# check again for dupes
omicsdata %>% get_dupes(mz_rt)
## # A tibble: 0 × 89
## # ℹ 89 variables: mz_rt <chr>, dupe_count <int>, row_id <dbl>,
## #   x5101_b1_control_c18neg_82 <dbl>, x5105_b3_lyc_c18neg_21 <dbl>,
## #   x5112_b1_beta_c18neg_34 <dbl>, x5107_b1_beta_c18neg_29 <dbl>,
## #   x5105_b1_lyc_c18neg_76 <dbl>, x5102_b1_control_c18neg_5 <dbl>,
## #   x5101_b3_control_c18neg_66 <dbl>, x5103_b1_lyc_c18neg_35 <dbl>,
## #   x5104_b3_lyc_c18neg_32 <dbl>, x5109_b3_beta_c18neg_81 <dbl>,
## #   x5104_b1_lyc_c18neg_10 <dbl>, x5108_b1_control_c18neg_71 <dbl>, …
# how many features
nrow(omicsdata)
## [1] 1041

Sometimes a weird logical column (lgl) comes up in my data. Let’s check if it’s there

colnames(omicsdata)
##  [1] "mz_rt"                      "row_id"                    
##  [3] "x5101_b1_control_c18neg_82" "x5105_b3_lyc_c18neg_21"    
##  [5] "x5112_b1_beta_c18neg_34"    "x5107_b1_beta_c18neg_29"   
##  [7] "x5105_b1_lyc_c18neg_76"     "x5102_b1_control_c18neg_5" 
##  [9] "x5101_b3_control_c18neg_66" "x5103_b1_lyc_c18neg_35"    
## [11] "x5104_b3_lyc_c18neg_32"     "x5109_b3_beta_c18neg_81"   
## [13] "x5104_b1_lyc_c18neg_10"     "x5108_b1_control_c18neg_71"
## [15] "x5113_b3_beta_c18neg_47"    "x5111_b1_control_c18neg_4" 
## [17] "x5109_b1_beta_c18neg_65"    "x5111_b3_control_c18neg_39"
## [19] "x5110_b1_lyc_c18neg_59"     "x5102_b3_control_c18neg_33"
## [21] "x5108_b3_control_c18neg_22" "x5103_b3_lyc_c18neg_63"    
## [23] "x5107_b3_beta_c18neg_28"    "x5112_b3_beta_c18neg_56"   
## [25] "x5113_b1_beta_c18neg_53"    "x5110_b3_lyc_c18neg_84"    
## [27] "x5114_b1_beta_c18neg_26"    "x5114_b3_beta_c18neg_23"   
## [29] "x5122_b3_lyc_c18neg_75"     "x5124_b3_control_c18neg_68"
## [31] "x5117_b3_lyc_c18neg_2"      "x5120_b1_beta_c18neg_72"   
## [33] "x5115_b1_lyc_c18neg_36"     "x5125_b3_control_c18neg_51"
## [35] "x5116_b3_control_c18neg_20" "x5126_b3_beta_c18neg_24"   
## [37] "x5118_b3_lyc_c18neg_9"      "x5117_b1_lyc_c18neg_46"    
## [39] "x5123_b3_control_c18neg_40" "x5115_b3_lyc_c18neg_70"    
## [41] "x5122_b1_lyc_c18neg_14"     "x5125_b1_control_c18neg_80"
## [43] "x5123_b1_control_c18neg_11" "x5116_b1_control_c18neg_6" 
## [45] "x5120_b3_beta_c18neg_54"    "x5121_b1_beta_c18neg_69"   
## [47] "x5121_b3_beta_c18neg_48"    "x5118_b1_lyc_c18neg_57"    
## [49] "x5124_b1_control_c18neg_45" "x5119_b3_control_c18neg_58"
## [51] "x5119_b1_control_c18neg_74" "x5127_b1_control_c18neg_30"
## [53] "x5131_b1_beta_c18neg_38"    "x5135_b1_lyc_c18neg_12"    
## [55] "x5129_b3_lyc_c18neg_16"     "x5131_b3_beta_c18neg_3"    
## [57] "x5134_b3_beta_c18neg_64"    "x5133_b3_control_c18neg_15"
## [59] "x5127_b3_control_c18neg_83" "x5126_b1_beta_c18neg_62"   
## [61] "x5136_b1_beta_c18neg_44"    "x5133_b1_control_c18neg_27"
## [63] "x5134_b1_beta_c18neg_42"    "x5135_b3_lyc_c18neg_18"    
## [65] "x5128_b1_lyc_c18neg_8"      "x5128_b3_lyc_c18neg_60"    
## [67] "x5136_b3_beta_c18neg_77"    "x5132_b1_beta_c18neg_41"   
## [69] "x5132_b3_beta_c18neg_52"    "x5129_b1_lyc_c18neg_78"    
## [71] "x5130_b3_lyc_c18neg_50"     "x5130_b1_lyc_c18neg_17"    
## [73] "qc2_c18neg_7"               "qc1_c18neg_1"              
## [75] "qc3_c18neg_13"              "qc4_c18neg_19"             
## [77] "qc5_c18neg_25"              "qc7_c18neg_37"             
## [79] "qc8_c18neg_43"              "qc6_c18neg_31"             
## [81] "qc14_c18neg_79"             "qc13_c18neg_73"            
## [83] "qc12_c18neg_67"             "qc10_c18neg_55"            
## [85] "qc15_c18neg_85"             "qc11_c18neg_61"            
## [87] "qc9_c18neg_49"              "x88"
# remove lgl column
omicsdata <- omicsdata %>%
  dplyr::select(!where(is.logical)) 

colnames(omicsdata)
##  [1] "mz_rt"                      "row_id"                    
##  [3] "x5101_b1_control_c18neg_82" "x5105_b3_lyc_c18neg_21"    
##  [5] "x5112_b1_beta_c18neg_34"    "x5107_b1_beta_c18neg_29"   
##  [7] "x5105_b1_lyc_c18neg_76"     "x5102_b1_control_c18neg_5" 
##  [9] "x5101_b3_control_c18neg_66" "x5103_b1_lyc_c18neg_35"    
## [11] "x5104_b3_lyc_c18neg_32"     "x5109_b3_beta_c18neg_81"   
## [13] "x5104_b1_lyc_c18neg_10"     "x5108_b1_control_c18neg_71"
## [15] "x5113_b3_beta_c18neg_47"    "x5111_b1_control_c18neg_4" 
## [17] "x5109_b1_beta_c18neg_65"    "x5111_b3_control_c18neg_39"
## [19] "x5110_b1_lyc_c18neg_59"     "x5102_b3_control_c18neg_33"
## [21] "x5108_b3_control_c18neg_22" "x5103_b3_lyc_c18neg_63"    
## [23] "x5107_b3_beta_c18neg_28"    "x5112_b3_beta_c18neg_56"   
## [25] "x5113_b1_beta_c18neg_53"    "x5110_b3_lyc_c18neg_84"    
## [27] "x5114_b1_beta_c18neg_26"    "x5114_b3_beta_c18neg_23"   
## [29] "x5122_b3_lyc_c18neg_75"     "x5124_b3_control_c18neg_68"
## [31] "x5117_b3_lyc_c18neg_2"      "x5120_b1_beta_c18neg_72"   
## [33] "x5115_b1_lyc_c18neg_36"     "x5125_b3_control_c18neg_51"
## [35] "x5116_b3_control_c18neg_20" "x5126_b3_beta_c18neg_24"   
## [37] "x5118_b3_lyc_c18neg_9"      "x5117_b1_lyc_c18neg_46"    
## [39] "x5123_b3_control_c18neg_40" "x5115_b3_lyc_c18neg_70"    
## [41] "x5122_b1_lyc_c18neg_14"     "x5125_b1_control_c18neg_80"
## [43] "x5123_b1_control_c18neg_11" "x5116_b1_control_c18neg_6" 
## [45] "x5120_b3_beta_c18neg_54"    "x5121_b1_beta_c18neg_69"   
## [47] "x5121_b3_beta_c18neg_48"    "x5118_b1_lyc_c18neg_57"    
## [49] "x5124_b1_control_c18neg_45" "x5119_b3_control_c18neg_58"
## [51] "x5119_b1_control_c18neg_74" "x5127_b1_control_c18neg_30"
## [53] "x5131_b1_beta_c18neg_38"    "x5135_b1_lyc_c18neg_12"    
## [55] "x5129_b3_lyc_c18neg_16"     "x5131_b3_beta_c18neg_3"    
## [57] "x5134_b3_beta_c18neg_64"    "x5133_b3_control_c18neg_15"
## [59] "x5127_b3_control_c18neg_83" "x5126_b1_beta_c18neg_62"   
## [61] "x5136_b1_beta_c18neg_44"    "x5133_b1_control_c18neg_27"
## [63] "x5134_b1_beta_c18neg_42"    "x5135_b3_lyc_c18neg_18"    
## [65] "x5128_b1_lyc_c18neg_8"      "x5128_b3_lyc_c18neg_60"    
## [67] "x5136_b3_beta_c18neg_77"    "x5132_b1_beta_c18neg_41"   
## [69] "x5132_b3_beta_c18neg_52"    "x5129_b1_lyc_c18neg_78"    
## [71] "x5130_b3_lyc_c18neg_50"     "x5130_b1_lyc_c18neg_17"    
## [73] "qc2_c18neg_7"               "qc1_c18neg_1"              
## [75] "qc3_c18neg_13"              "qc4_c18neg_19"             
## [77] "qc5_c18neg_25"              "qc7_c18neg_37"             
## [79] "qc8_c18neg_43"              "qc6_c18neg_31"             
## [81] "qc14_c18neg_79"             "qc13_c18neg_73"            
## [83] "qc12_c18neg_67"             "qc10_c18neg_55"            
## [85] "qc15_c18neg_85"             "qc11_c18neg_61"            
## [87] "qc9_c18neg_49"

Tidy

# create long df for omics df
omicsdata_tidy <- omicsdata %>%
  pivot_longer(cols = 3:ncol(.),
               names_to = "sample",
               values_to = "peak_height") %>%
  mutate(sample2 = sample) %>%
  # add a new column with just subject
  rename("subject" = sample2) %>%
  # remove the suffix from subject names
  mutate_at("subject", str_sub, start=2, end=5)

Combine dfs

## tibble [88,485 × 18] (S3: tbl_df/tbl/data.frame)
##  $ subject          : chr [1:88485] "5101" "5105" "5112" "5107" ...
##  $ sample           : chr [1:88485] "x5101_b1_control_c18neg_82" "x5105_b3_lyc_c18neg_21" "x5112_b1_beta_c18neg_34" "x5107_b1_beta_c18neg_29" ...
##  $ treatment        : chr [1:88485] "control" "red" "beta" "beta" ...
##  $ tomato_or_control: chr [1:88485] "control" "tomato" "tomato" "tomato" ...
##  $ mz               : num [1:88485] 273 273 273 273 273 ...
##  $ rt               : num [1:88485] 0.485 0.485 0.485 0.485 0.485 0.485 0.485 0.485 0.485 0.485 ...
##  $ row_id           : num [1:88485] 62 62 62 62 62 62 62 62 62 62 ...
##  $ peak_height      : num [1:88485] 11987 15548 14778 13083 14824 ...
##  $ sex              : chr [1:88485] "F" "M" "F" "M" ...
##  $ bmi              : num [1:88485] 29.4 33.5 26 23.8 33.5 ...
##  $ age              : num [1:88485] 55 61 60 68 61 62 55 50 37 65 ...
##  $ tot_chol         : num [1:88485] 235 189 235 177 189 229 235 172 203 127 ...
##  $ ldl_chol         : num [1:88485] 150.4 125.6 149.2 85.4 125.6 ...
##  $ hdl_chol         : num [1:88485] 71 45 52 79 45 40 71 53 31 40 ...
##  $ triglycerides    : num [1:88485] 68 92 169 63 92 184 68 38 125 88 ...
##  $ glucose          : num [1:88485] 90 103 92 102 103 94 90 92 93 87 ...
##  $ SBP              : num [1:88485] 156 131 107 122 131 101 156 106 100 147 ...
##  $ DBP              : num [1:88485] 90 78 70 58 78 62 90 71 67 76 ...
# replace NA's in certain columns with QC
meta_omics_sep$subject <- str_replace_all(meta_omics_sep$subject, "c", "qc")
  

meta_omics_sep$sample <- meta_omics_sep$sample %>%
  replace_na("QC")

meta_omics_sep$treatment <- meta_omics_sep$treatment %>%
  replace_na("QC")

meta_omics_sep$tomato_or_control <- meta_omics_sep$tomato_or_control %>%
  replace_na("QC")

Data summaries

Number of masses detected

nrow(omicsdata)
## [1] 1041

Mass range for metabolites detected?

range(meta_omics_sep$mz)
## [1]   89.0243 1697.1555

RT range for metabolites detected?

range(meta_omics_sep$rt)
## [1]  0.485 11.170

Mass vs RT scatterplot

# plot
(plot_mzvsrt <- meta_omics_sep %>%
  ggplot(aes(x = rt, y = mz)) +
  geom_point() +
  theme_minimal() +
  labs(x = "Retention time, min",
       y = "m/z",
       title = "mz across RT for all features"))

Histogram for mass range

meta_omics_sep %>%
  group_by(mz) %>%
  ggplot(aes(x = mz)) +
  geom_histogram(binwidth = 25) +
  theme_minimal() +
  labs(x = "Monoisotopic mass (amu)",
       y = "Number of features",
       title = "Distribution of features by mass")

Histogram for RT

meta_omics_sep %>%
  group_by(mz) %>%
  ggplot(aes(x = rt)) +
  geom_histogram(binwidth = 0.1) + # 6 second bins
  theme_minimal() +
  labs(x = "Retention time",
       y = "Number of features",
       title = "Distribution of features by retention time")

NAs and imputing

NAs

# samples only (no QCs)
omicsdata_noQC <- omicsdata %>%
  dplyr::select(-contains("qc"))

#NAs in samples only?
NAbyRow_noQC <- rowSums(is.na(omicsdata_noQC[,-1]))

hist(NAbyRow_noQC,
     breaks = 70, # because there are 70 samples 
     xlab = "Number of missing values",
     ylab = "Number of metabolites",
     main = "How many missing values are there?")

Are there any missing values in QCs? There shouldn’t be after data preprocessing/filtering

omicsdata_QC <- omicsdata %>%
  dplyr::select(starts_with("qc")) 

NAbyRow_QC <- colSums(is.na(omicsdata_QC))
# lets confirm that there are no missing values from my QCs
sum(NAbyRow_QC) # no
## [1] 0
# calculate how many NAs there are per feature in whole data set
contains_NAs <- meta_omics %>%
  group_by(mz_rt) %>%
  count(is.na(peak_height)) %>%
  filter(`is.na(peak_height)` == TRUE)
kable(contains_NAs)
mz_rt is.na(peak_height) n
1315.8467_3.079 TRUE 52
137.0244_0.741 TRUE 6
151.0261_0.612 TRUE 15
1602.9935_2.726 TRUE 2
1604.0878_6.358 TRUE 3
1605.0902_6.358 TRUE 1
1668.2129_8.463 TRUE 1
1669.2155_8.46 TRUE 1
187.0515_0.642 TRUE 7
191.1076_0.694 TRUE 66
201.0226_0.688 TRUE 12
229.0537_0.703 TRUE 5
230.9967_0.644 TRUE 6
231.0795_0.662 TRUE 32
235.0972_0.69 TRUE 63
241.0868_1.048 TRUE 61
255.0871_0.663 TRUE 1
257.0795_0.669 TRUE 52
326.0874_0.626 TRUE 63
352.0856_0.687 TRUE 2
391.2849_2.246 TRUE 5
397.1499_0.653 TRUE 64
411.1294_0.644 TRUE 66
421.1543_0.701 TRUE 68
437.0542_0.688 TRUE 15
437.2904_2.11 TRUE 7
448.3062_1.477 TRUE 1
449.254_2.573 TRUE 1
453.285_1.371 TRUE 47
462.1763_0.655 TRUE 5
464.3013_0.999 TRUE 18
473.3474_4.696 TRUE 47
507.223_2.273 TRUE 2
514.2836_0.69 TRUE 31
517.2436_2.68 TRUE 60
559.4722_4.208 TRUE 1
624.3379_0.689 TRUE 1
624.3382_0.91 TRUE 19
784.549_6.62 TRUE 27
800.5587_8.868 TRUE 1
818.5544_4.825 TRUE 38
830.5005_2.723 TRUE 6
881.5332_7.243 TRUE 4

Remove NAs

There are some features that are missing in a majority of subjects. I’m going to remove those because they may skew the data.

# number of features
nrow(omicsdata)
## [1] 1041
# Removing features missing from over 90% of data
omit_features <- contains_NAs %>%
  filter(n/70 >= 0.90)

#preview
nrow(omit_features) # features to remove
## [1] 6
# how many features should be left?
nrow(omicsdata) - nrow(omit_features)
## [1] 1035
# now remove these features from the omics dataset
omicsdata <- omicsdata %>%
  anti_join(omit_features,
            by = "mz_rt")

 # check number of features now?
nrow(omicsdata)
## [1] 1035

Data imputation

# impute any missing values by replacing them with 1/2 of the lowest peak height value of a feature (i.e. in a row).
imputed_omicsdata <- omicsdata

imputed_omicsdata[] <- lapply(imputed_omicsdata, 
                              function(x) ifelse(is.na(x),
                                                 min(x, na.rm = TRUE)/2, x))

dim(imputed_omicsdata)
## [1] 1035   87

Are there any NAs?

imputed_omicsdata %>%
  is.na() %>%
  sum()
## [1] 0
# imputations worked

New tidy df

# create long df for imputed omics df
imputed_omicsdata_tidy <- imputed_omicsdata %>%
  pivot_longer(cols = 3:ncol(.),
               names_to = "sample",
               values_to = "peak_height") %>%
  mutate(sample2 = sample) %>%
  # add a new column with just subject
  rename("subject" = sample2) %>%
  # remove the suffix from subject names
  mutate_at("subject", str_sub, start=2, end=5) 

# combine meta and imputed omics dfs
imp_meta_omics <- full_join(imputed_omicsdata_tidy,
                         metadata,
                         by = c("subject" = "subject"))
# separate mz and rt
imp_meta_omics_sep <- imp_meta_omics %>%
  separate(col = mz_rt,
           into = c("mz", "rt"),
           sep = "_") 

# convert columns to correct type
imp_meta_omics_sep$mz <- as.numeric(imp_meta_omics_sep$mz)
imp_meta_omics_sep$rt <- as.numeric(imp_meta_omics_sep$rt)

Notame feature reduction

vignette for reference

#browseVignettes("notame")

Let’s look at what masses come up at each RT again

# rt vs mz plot
imp_meta_omics_sep %>%
  ggplot(aes(x = rt, y = mz)) +
  geom_point() +
  theme_minimal() +
  labs(x = "RT (min)",
       y = "mz")

There are some points that are at the same RT, meaning they could be coming from the same compound. We’ll run notame clustering to collapse features coming from one mass into one feature.

Data restructuring for notame

# create features list from imputed data set to only include unique feature ID's (mz_rt), mz and RT
features <- imp_meta_omics_sep %>%
  cbind(imp_meta_omics$mz_rt) %>%
  rename("mz_rt" = "imp_meta_omics$mz_rt") %>%
  dplyr::select(c(mz_rt, mz, rt)) %>%
  distinct() # remove the duplicate rows

# create a second data frame which is just imp_meta_omics restructured to another wide format
data_notame <- data.frame(imputed_omicsdata %>%
                            dplyr::select(-row_id) %>%
                            t())

data_notame <- data_notame %>%
  tibble::rownames_to_column() %>% # change samples from rownames to its own column
  row_to_names(row_number = 1) # change the feature IDs (mz_rt) from first row obs into column names

Check structures

# check if mz and rt are numeric
str(features)
## 'data.frame':    1035 obs. of  3 variables:
##  $ mz_rt: chr  "272.9587_0.485" "288.9363_0.485" "226.9658_0.499" "294.9532_0.5" ...
##  $ mz   : num  273 289 227 295 363 ...
##  $ rt   : num  0.485 0.485 0.499 0.5 0.501 0.514 0.514 0.515 0.515 0.515 ...
# check if results are numeric
head(data_notame, n = 1)
##                        mz_rt 272.9587_0.485 288.9363_0.485 226.9658_0.499
## 2 x5101_b1_control_c18neg_82     11986.5490     21534.8980     28760.8710
##   294.9532_0.5 362.9406_0.501 520.9099_0.514 588.8973_0.514 452.9225_0.515
## 2   22338.5640     34403.1300    114667.8360     98069.3900    102553.1200
##   656.8848_0.515 724.8722_0.515 792.8596_0.515 384.9351_0.516 316.9477_0.518
## 2     59991.9960     46757.6500     28809.4430     97462.6900    129814.3400
##   604.8712_0.518 248.9604_0.52 215.0328_0.588 217.0297_0.589 151.0261_0.612
## 2     43247.6520   139909.1600    423488.8000    147959.5300      1008.0625
##   335.0471_0.599 649.1192_0.601 167.021_0.602 665.0885_0.607 643.1067_0.611
## 2     89597.6100     17832.4840   169550.3600     17469.2250     21769.1270
##   627.1374_0.611 329.0355_0.613 621.1249_0.613 459.1113_0.613 935.1964_0.613
## 2     35917.1130     44170.4260     19929.6100     12582.7990      6787.0806
##   919.2277_0.616 605.1555_0.616 313.0652_0.617 291.0839_0.618 128.0352_0.617
## 2      9664.9620     76629.0500    232746.4500   1622794.8000     35370.3630
##   583.1735_0.618 247.0933_0.62 293.0879_0.621 191.0197_0.621 111.0086_0.62
## 2     16841.3160    30654.0470     35340.3240    643951.4000   150325.2200
##   950.1575_0.623 636.085_0.627 658.0669_0.628 680.0486_0.63 389.052_0.635
## 2      3818.7810    17712.3800     17415.8850     6436.0660    23057.9500
##   263.1035_0.638 277.0734_0.639 343.9948_0.639 172.9913_0.642 187.0418_0.642
## 2     66218.5000     41315.5550    216509.7300    115296.5800    209861.0800
##   187.0515_0.642 345.9989_0.642 300.0047_0.643 201.0575_0.644 188.9862_0.644
## 2     14098.1120      6601.0000     23712.5230     48690.5860      9552.8840
##   89.0243_0.645 230.9967_0.644 93.0344_0.646 178.0509_0.647 479.0972_0.649
## 2   239368.3800      1436.5206    31256.6620     23041.9240     31571.9530
##   103.04_0.651 462.1763_0.655 187.007_0.66 203.0013_0.66 107.0502_0.661
## 2   48823.0800      3000.7876  600991.2000     7830.9595    110424.4450
##   194.0457_0.66 255.0871_0.663 383.1529_0.667 187.0165_0.665 117.0557_0.669
## 2     3220.5076      8777.2920      1042.2191     16411.9530     56197.1560
##   291.0953_0.67 245.0486_0.685 352.0856_0.687 201.0226_0.688 413.1998_0.688
## 2    15675.7380     17020.8540      8563.7650      1560.3474      6060.3726
##   437.0542_0.688 510.2523_0.688 624.3379_0.689 514.2836_0.69 213.0223_0.689
## 2      1315.9800      6418.2686      6967.8380      504.0312      3920.3600
##   397.1781_0.69 129.0557_0.69 367.1581_0.691 257.0795_0.669 528.2631_0.691
## 2    13469.2600   126977.6400     36765.0980       504.0312      7024.1000
##   231.0795_0.662 397.2049_0.693 229.0537_0.703 244.908_0.706 246.9051_0.707
## 2      1033.3367     10682.8890      1605.1570    28453.5800     26781.3090
##   369.1735_0.722 137.0244_0.741 624.3382_0.91 239.0923_0.975 464.3013_0.999
## 2     16647.0840      2228.7122     2404.1950     13168.3100       504.0312
##   241.0868_1.048 448.3063_1.326 453.285_1.371 583.2555_1.358 448.3062_1.477
## 2       504.0312      2249.9277      504.0312      8213.1480      2152.3337
##   267.1235_1.539  507.223_1.7 437.2904_2.11 586.3143_2.221 391.2849_2.246
## 2     14312.3720   28249.8280     2109.4116      7916.0166      7834.5107
##   562.3143_2.27 507.223_2.273 297.1527_2.281 512.2988_2.28 311.2224_2.465
## 2     6131.5140     5463.4160      4852.7866    18104.6400      4982.1772
##   538.3144_2.488 449.254_2.573 612.33_2.594 640.2923_2.673 656.3173_2.673
## 2     26836.0620     3670.2560   27236.7710      8631.6280     11211.9810
##   578.3011_2.673 588.3302_2.677 526.3144_2.683 311.1683_2.682 1107.6619_2.7
## 2     11934.0640    156921.7200     14725.9940     10671.6130     6479.0815
##   517.2436_2.68 524.2776_2.71 830.5005_2.723 1151.649_2.727 504.3089_2.726
## 2      504.0312    17717.5160      1502.1267      2805.0450     18348.5370
##   564.3308_2.727 1135.6242_2.73 556.299_2.728 694.2877_2.728 1083.6621_2.728
## 2    396449.9700      2101.6200    10870.7270     11570.6170      15289.0240
##   616.2924_2.728 554.3012_2.728 1073.6331_2.728 632.3174_2.729 1602.9935_2.726
## 2     20911.8340     28204.3280       3184.2246     25367.3900       1053.2416
##   619.2886_2.757 500.2777_2.802 614.3455_2.824 476.2777_2.847 590.3457_2.989
## 2     12485.9420     35047.2400      7444.0780     27902.5570     39904.7900
##   1521.9681_3.075 670.2878_3.073 1165.6197_3.074 532.2989_3.075 530.3013_3.075
## 2       2808.4710     21550.0350       6353.8237     23154.2200     62886.2770
##   1025.6334_3.075 592.2925_3.075 540.3313_3.076 608.3174_3.076 1035.6627_3.076
## 2      12987.2740     42669.5270   1157627.5000     52637.2970      93593.6800
##   654.31_3.076 1103.6493_3.076 480.309_3.076 1087.6246_3.076 1531.9972_3.076
## 2    8150.1400      14690.8430    47245.8500      10563.3290       7595.6387
##   1520.9647_3.076 1027.6336_3.076 1530.994_3.076 1598.9806_3.076
## 2       3523.7397       6002.6210     10113.0330       2481.0215
##   1315.8467_3.079 820.5155_3.079 1061.6776_3.089 452.2777_3.197 618.308_3.232
## 2        504.0312      2857.1274       7589.4805     23911.5370    14584.3490
##   634.3329_3.232 506.3245_3.232 566.3462_3.232 556.3168_3.233 696.3033_3.233
## 2     20147.4020     10277.2140    273539.3400     25799.9820      7031.4870
##   1087.6933_3.233 558.3148_3.234 478.2933_3.354 524.3351_3.376 526.3505_3.4
## 2       7558.6090      8811.2780     16215.1490     21914.5800   18850.2320
##   592.3612_3.407 554.3456_3.441 436.2827_3.522 552.3663_3.532 698.3189_3.775
## 2      7309.2260     20630.9320     13906.4640     11245.3920      8278.1290
##   1159.7117_3.776 1081.6957_3.777 508.3402_3.777 568.3621_3.777 620.3237_3.777
## 2       4318.5205       5479.5150     16299.1320    532299.4400     24095.6450
##   1143.6869_3.778 636.3486_3.777 558.3325_3.778 1091.7248_3.778 626.3198_3.778
## 2       3467.0476     39472.6130     42671.3800      21538.7910     10507.0020
##   560.3303_3.778 1615.0859_3.778 594.3768_3.858 480.309_3.883 599.3194_3.921
## 2     14168.7450       2119.9607      6830.7280    45650.4400     15658.0970
##   583.2554_3.939 605.2373_3.94 1167.518_3.94 554.3818_4.037 414.0583_4.043
## 2     23206.5250     6507.5527     5111.5010      7755.4146      8064.4450
##   253.2169_4.044 327.2325_4.055 511.3996_4.087 464.314_4.127 303.2326_4.149
## 2      3715.8516     40238.2850      3120.4510    17825.3830     43368.2270
##   440.0739_4.207 442.071_4.208 279.2327_4.208 444.0682_4.208 559.4722_4.208
## 2     56946.7030    46998.2070    129523.0160     17429.4550      8758.2900
##   463.3422_4.219 537.4153_4.24 539.4304_4.266 539.4306_4.266 573.4515_4.266
## 2      4484.4497    33903.0470     13237.3580     13237.3580     11812.4580
##   445.3316_4.28 467.3735_4.306 591.462_4.314 445.3316_4.415 539.4309_4.416
## 2    16675.6540     24954.8000     5188.5474     22877.8380     10927.5510
##   511.3997_4.453 447.3471_4.499 493.389_4.514 447.3471_4.631 473.3629_4.632
## 2      3652.2422     11653.1750     5953.3700     11625.6970      5888.9800
##   567.4621_4.643 446.0838_4.646 444.0866_4.647 281.2484_4.648 442.0896_4.647
## 2      4465.4155     19138.6820     50135.1560    200246.7800     51583.4450
##   563.5036_4.648 591.462_4.651 449.3627_4.663 593.4778_4.664 575.467_4.662
## 2     23532.0410     6583.1655      9165.3930     35374.8830     3355.5427
##   473.3474_4.696 425.363_4.712 441.3942_4.718 491.3733_4.784 818.5544_4.825
## 2       504.0312    12562.7590      4651.2950      4547.7983       504.0312
##   551.3582_4.841 573.4515_4.873 561.3787_4.908 577.3738_4.918 617.4753_4.956
## 2      1659.1428      5616.5020      8191.6600      5274.4893      3398.3782
##   595.4933_4.953 691.5022_4.977 495.4046_4.993   397.3681_5 717.5179_5.106
## 2     23644.1680     11188.6350      4821.5300    6125.1910     27211.0740
##   465.3192_5.112 465.3038_5.114 591.3894_5.174 705.5178_5.308 479.3193_5.338
## 2      8263.3955    110951.5100     11246.6020      6977.3240      6625.6714
##   575.4672_5.354 411.3837_5.349 605.4051_5.422 579.3893_5.557 878.584_5.681
## 2      3909.9460      7838.0220      6459.4814      2674.2950     4946.8696
##   1394.0685_5.684 787.5209_5.683 709.5047_5.684 719.534_5.684 771.4961_5.685
## 2       4091.1677     22534.1900     23499.2420   222421.5600     10974.9320
##   711.5035_5.685 849.4911_5.685 493.3349_5.699 722.4967_5.728 904.599_5.836
## 2      9168.9520      6182.0674     10544.2640      3234.9639     6464.1490
##   1447.1028_5.846 1446.0998_5.845 875.5066_5.845 735.5203_5.846 813.5365_5.846
## 2       8393.4350      10199.0020      9896.5600     37915.4380     33982.0820
##   737.5193_5.846 745.5498_5.846 859.5292_5.846 803.5076_5.847 797.5117_5.847
## 2     15724.5500    381718.6600      6394.4097     11439.6400     18180.0400
##   1271.7465_5.862 848.5434_5.871 822.5279_5.875 748.5122_5.882 824.5433_5.925
## 2       9264.0960      5360.7744      6334.9043      3378.6714      5833.0910
##   818.554_5.972 818.5539_5.971   721.5493_6    721.549_6 848.5433_6.017
## 2     6304.4487      9040.8240    8293.6070    8293.6070      5426.5117
##   798.5279_6.032 733.5494_6.091 801.5366_6.09 723.5203_6.092 765.5735_6.098
## 2     26310.0040    126621.0100    13265.0940     15401.5330      6608.7260
##   771.5646_6.096 764.4992_6.1 842.5154_6.099 774.5282_6.1 898.559_6.11
## 2     12778.7190    5535.0215      6602.7666   55365.6680    3685.2770
##   763.5596_6.181 1068.6675_6.19 801.547_6.254 790.5149_6.254 800.5438_6.256
## 2     13917.5860     13256.2270    26554.4240      8090.8223     54200.4000
##   868.531_6.255 874.559_6.259 759.5646_6.287 836.5434_6.295 557.4566_6.309
## 2     7316.0400     9442.5750      9749.2750      8236.6190      8280.5880
##   1605.0902_6.358 1604.0878_6.358 882.5021_6.358 824.5441_6.359 814.5148_6.359
## 2       2503.2397       1919.8804      6036.3770    157509.4700     18936.0020
##   892.531_6.359 816.5151_6.359 876.5059_6.36 954.5018_6.361 840.5304_6.407
## 2    16966.9240      7578.4750     9698.0330      5114.8510      8459.3210
##   850.5595_6.407 790.5148_6.407 918.5466_6.408 800.5433_6.41 868.5308_6.41
## 2     65896.5100      6673.6377      8493.9850    57832.4060     6448.3480
##   801.547_6.409 812.5436_6.468 884.518_6.476 879.5263_6.489 816.5318_6.478
## 2    29100.6300     21515.1350     4892.3020      5314.6626     13349.5430
##   818.5302_6.479 956.5168_6.479 894.5465_6.48 1608.119_6.481 826.5598_6.482
## 2      5292.8687      4111.5107    12525.5670      1456.6576    111413.3000
##   878.5241_6.495 1530.1292_6.506 1529.1254_6.507 896.5849_6.505 906.6148_6.513
## 2     15045.6350       7696.4670       7073.6133      5749.3050     25188.6130
##   1519.1193_6.539 1491.1091_6.544 747.5662_6.538 1450.1318_6.54 1441.1057_6.541
## 2      10325.6550       3698.7026   1126503.9000     65371.4060      11406.0780
##   1518.1184_6.541 1502.0921_6.54 739.5351_6.541 1440.1025_6.541 861.5449_6.542
## 2      12439.5910      7361.1310     34892.3630      13591.2950     12531.6820
##   799.5274_6.542 831.526_6.542 764.5548_6.543 737.5362_6.543 815.5524_6.543
## 2     40890.1100     7634.1377     12854.4380     91910.2660     83607.6500
##   877.5224_6.543 1503.101_6.546 788.5437_6.549 805.5234_6.55 883.5394_6.551
## 2     23042.7340      8019.2725     27396.0900    19062.6580     13138.2480
##   945.5095_6.552 1451.1351_6.539 801.5445_6.55 800.5402_6.543 750.528_6.591
## 2      7267.6800      57017.0430    18246.8000     35417.1300    27264.1720
##   820.5694_6.598 784.549_6.62 1151.7045_6.635 838.5592_6.651 876.5748_6.674
## 2      5591.0806     504.0312      16743.6840      3385.6418      5824.5205
##   814.5592_6.699 773.5806_6.749 763.5516_6.749 841.5661_6.75 1579.1408_6.75
## 2      5335.2430    156829.1900     17065.5530    17132.0640      7385.7656
##   1656.1198_6.753 850.5603_6.753 1582.1048_6.758 842.5312_6.754 1657.1231_6.754
## 2       8507.5730    383956.2200       3297.0112     17908.6230       8909.0860
##   853.572_6.759 1646.0906_6.756 840.5306_6.756 902.5217_6.756 867.5493_6.755
## 2    16663.1880       2485.1140     41751.7730     22894.2030      6170.3340
##   986.5339_6.756 918.5467_6.756 964.5391_6.756 970.4999_6.757 908.5177_6.758
## 2      8439.8430     40072.3000      5975.6445      5105.9140     13004.3440
##   980.5167_6.758 776.5438_6.762 1647.0986_6.756 844.5327_6.766 766.5148_6.768
## 2     11173.4750     87543.6100       2520.8220     13258.0540      8478.3030
##   828.5061_6.771 808.5482_6.817 546.1884_6.859 550.1831_6.859 545.3463_6.86
## 2      5257.7920      2870.9343     30991.6600     10394.8545    24574.5300
##   519.347_6.861 548.1856_6.861 557.457_6.865 559.4719_6.867 543.3083_6.873
## 2    18584.6290     31491.5490     3774.5525      4240.5786      8250.8710
##   560.2269_6.891 561.2272_6.889 876.5748_6.891 473.3439_6.896 739.5515_6.896
## 2      5078.9230      5696.8022      8479.1440     10678.1790     11276.6630
##   645.4854_6.897 749.5806_6.906 749.5804_6.907 816.5308_6.915 818.5304_6.915
## 2      6815.6978     23554.2560     23554.2560     92555.0160     35193.7660
##   946.5031_6.923 843.5493_6.926 884.518_6.929 1600.0951_6.94 962.534_6.937
## 2      8240.4930     11779.9900    15864.8000      7945.2354     9319.6450
##   878.522_6.938 1599.0952_6.94 1598.0913_6.94 894.5469_6.945 1676.1068_6.945
## 2    34961.7900      9671.2290      9272.7360     70189.6300       8662.0300
##   956.5171_6.945 940.5392_6.946 1677.1104_6.945 1608.1204_6.95 1609.1238_6.95
## 2     21859.5800     10560.0190       7693.5790     37296.6400     38017.9400
##   826.5606_6.953 886.5195_6.961 1660.08_6.945 810.5642_6.968 1575.0947_6.977
## 2    828296.4400      6658.6170     4503.8657      2061.9120       6851.5527
##   1652.1073_6.976 1574.0913_6.977 1584.1204_6.981 1585.1238_6.981
## 2       7466.5205       8431.1530      34260.9100      33486.1950
##   795.5319_7.041 1561.1246_7.026 802.5612_7.026 1560.1212_7.025 871.5502_7.054
## 2     14637.8060      87123.4700   1357793.5000      96113.1700     41827.1520
##   1551.0949_7.03 1628.1079_7.03 1550.0916_7.031 1629.1111_7.028 917.5422_7.049
## 2     14490.1470     14638.6000      13662.6840      12221.6460      8263.7550
##   1612.0825_7.034 792.5308_7.046 794.5298_7.047 916.5393_7.053 1610.1346_7.034
## 2       7057.5340     86525.6500     35337.5980     12739.0300      22415.3320
##   761.5803_7.053 932.5173_7.054 1611.1384_7.055 854.522_7.057 870.547_7.057
## 2     19171.0760     23813.2150       9165.0530    34324.8630    84686.4800
##   1520.0675_7.067 886.5199_7.016 762.507_7.071 860.5179_7.078 938.534_7.079
## 2       3811.9190      8245.6875    32796.7460     15533.7880    10826.0980
##   922.5024_7.08 1000.5039_7.081 852.5752_7.104 844.5463_7.11 920.5621_7.108
## 2     7704.4320       7322.0195    120860.0800     6777.9770     14412.5760
##   842.546_7.109 904.5364_7.114 1586.1348_7.163 878.5901_7.193 720.4962_7.178
## 2    14882.3710      7048.3574       3374.4092      4193.5596      5568.1133
##   830.5815_7.188 1613.1542_7.188 942.5549_7.193 896.5624_7.191 958.5324_7.191
## 2     39760.6330       4131.9590      6944.3384     34076.4450     10640.0040
##   818.5462_7.192 1612.1504_7.187 880.5375_7.198 828.5759_7.19 820.5463_7.196
## 2     34030.3320       4982.6816     16646.3570   269664.9700     14294.4050
##   886.5328_7.202 948.5172_7.192 964.5495_7.201 881.5397_7.202 1602.121_7.207
## 2     11507.0640      4908.6304      8291.8480      9636.1840      1752.1300
##   788.5223_7.225 834.5643_7.242 881.5332_7.243 807.5001_7.254 790.5593_7.252
## 2      3845.7795     16588.3650      7665.8945      5144.8730     25775.3700
##   864.5747_7.263 738.507_7.269 806.4942_7.271 746.5118_7.267 878.5903_7.305
## 2      7477.0130    39627.3120      5332.4136      3596.2605      7596.1035
##   840.5749_7.321 1602.1228_7.339 948.5173_7.337 886.5331_7.335 897.5657_7.337
## 2     16394.4220       3432.8390      8086.6675     16539.9980     28673.6520
##   1026.5195_7.338 964.5495_7.339 818.5462_7.337 958.5325_7.337 942.5548_7.339
## 2       7702.3306     12165.5910     55049.5550     15019.3560      9148.1640
##   1603.1254_7.34 880.5376_7.34 828.5759_7.339 896.5624_7.34 820.5462_7.34
## 2      4002.3570    25622.8140    430864.8000    51577.6800    22564.8650
##   1612.1508_7.34 845.5636_7.343 1637.1538_7.351 1613.1545_7.34 912.5357_7.346
## 2     10090.1740      8650.3250       3598.2053     10747.8955      5677.1580
##   714.507_7.348 1636.1506_7.352 920.5621_7.373 854.5867_7.421 881.5405_7.337
## 2    21358.9750       3177.6514      9580.4890     18861.1040     12995.1875
##   852.5752_7.369 842.546_7.377 904.5361_7.374 843.5493_7.379 836.5799_7.404
## 2     69645.9300     9225.8790      5982.6323      5791.6274     12651.9100
##   764.5225_7.43 857.5176_7.442 800.5354_7.468 810.5647_7.467 878.5516_7.469
## 2    12744.6630     32854.1400     17461.8550    132522.1700     17583.5500
##   840.5749_7.471 862.527_7.471 868.5303_7.476 862.5261_7.47 800.5357_7.469
## 2     30003.9410    10110.1800      6806.3706    10110.1800     17461.8550
##   922.5767_7.503 854.5896_7.505 740.5225_7.515 833.5175_7.518 855.5937_7.505
## 2      5766.1430     29425.2870      7085.3794     24162.9400     17361.9450
##   862.5953_7.53 884.5607_7.548 776.5354_7.574 816.5751_7.553 806.5463_7.553
## 2     7405.0166      8423.6980     11808.3970     44148.6520      6009.2563
##   833.5544_7.557 884.5587_7.554 843.5839_7.561 767.5664_7.562 905.5552_7.563
## 2     10528.5640      7110.3060     32967.9600     12791.6700     10971.1730
##   765.5672_7.563 775.5965_7.563 786.5646_7.575 854.5519_7.576 776.5351_7.576
## 2     32845.1330    235038.4500     73149.2340      8554.0030     11808.3970
##   778.5595_7.588 768.5305_7.588 830.5218_7.589 846.5477_7.59 836.5799_7.605
## 2    106386.6200     13095.3370      6905.6960    15131.2390     24562.9730
##   883.5333_7.614 746.5121_7.622 814.4993_7.622 812.5802_7.632 864.5398_7.662
## 2      6894.4070     42279.5470      5209.3210     90708.6200      7775.5156
##   802.5529_7.634 880.5669_7.637 1179.7355_7.664 859.5339_7.699 855.5938_7.701
## 2     15428.4590     14540.6350       6533.5780      4189.1255     24039.5940
##   764.5224_7.695 922.5774_7.695 854.5906_7.701 788.5795_7.719 856.5627_7.726
## 2      5594.5650      7022.3516     41821.7930     29939.3220      5997.8154
##   828.5728_7.674 906.5814_7.742 838.5956_7.75 1598.1714_7.758 864.535_7.755
## 2     18499.0640      7983.9310    54082.3300       5964.2130     9644.0780
##   883.5331_7.753 862.5335_7.761 940.5496_7.764 1616.1136_7.768 924.518_7.766
## 2      6612.6390     20426.8340     13661.2270       4574.5190    10243.3730
##   888.5362_7.768 821.565_7.768 1633.1422_7.775 872.5626_7.769 1002.5196_7.769
## 2      7455.2085    11493.6920       8331.0010     87200.1640       6726.3164
##   856.5377_7.769 918.5543_7.768 796.5458_7.771 1555.1258_7.773 934.5326_7.772
## 2     38901.9020     13405.0330     32951.0600       8986.0300     24030.7560
##   794.5464_7.772 1554.1226_7.773 804.5762_7.774 918.5546_7.77 857.5409_7.768
## 2     84274.0600       9048.8280    816784.5600    13405.0330     20997.4380
##   1564.1517_7.775 1632.139_7.776 1565.1551_7.774 772.5276_7.782 1639.1701_7.792
## 2      35523.3500      7901.5444      31104.6350     13494.5000       7250.4443
##   1638.1667_7.792 878.5909_7.805 936.5439_7.803 1008.5435_7.813 870.5618_7.814
## 2       6213.1940     86858.2300      5752.7476       4836.8890      5132.1055
##   946.5777_7.814 868.5616_7.814 930.5504_7.815 1482.0881_7.834 801.6117_7.833
## 2     11800.3270     11311.2530      5586.2490       4683.7026     72313.0800
##   869.598_7.834 791.5828_7.838 824.5789_7.841 814.5949_7.87 864.6108_7.878
## 2    10249.8300     12324.8370      3535.8100    13830.4150      3409.7360
##   722.5123_7.861 790.4993_7.863 820.4801_7.866 780.4705_7.867 814.595_7.869
## 2    115125.7100     12781.5880      6431.2144      6948.0825    13830.4150
##   859.5338_7.864 814.5947_7.872 842.5905_7.891 827.6272_7.905 812.58_7.898
## 2      5668.9233     13830.4150      7701.9053     22540.6450   14386.5610
##   789.6114_7.911 792.5765_7.938 698.5121_7.962 777.6118_7.986 1558.1192_8.016
## 2      5187.0140      5050.9270     17849.7710     14208.7510       3159.3452
##   1052.5353_8.011 990.5651_8.013 974.5321_8.013 912.5491_8.014 748.5277_8.014
## 2       8414.3040     12534.1690      7662.0980     20708.5880     46733.6900
##   906.5531_8.016 922.5781_8.016 871.5805_8.017 846.5617_8.018 1655.1569_8.02
## 2     29787.6840     73024.1950     10395.6310     28928.2580      5415.9004
##   984.5483_8.018 1654.1535_8.02 938.5513_8.018 968.5707_8.019 844.562_8.02
## 2     18987.9920      5260.1740      5926.1855     11094.8690   72785.1500
##   1665.186_8.021 854.5918_8.021 1664.1825_8.021 914.5508_8.03 724.5275_8.059
## 2     15773.8000    597630.8000      16215.7400     9704.4000      6238.5977
##   1631.1566_8.057 814.5957_8.055 1630.1533_8.057 1641.1859_8.06 1640.1826_8.061
## 2       4667.3135      6033.9720       3949.3613     11569.0040      13329.3710
##   1616.183_8.109 945.5734_8.118 1685.1732_8.11 830.5921_8.11 1617.1865_8.109
## 2     30387.2130      9049.9750      8840.7930   810380.7500      33352.4530
##   1684.1698_8.112 1607.1572_8.113 1606.1538_8.113 880.6062_8.116
## 2       8998.0205       9455.1980       8503.0580     24042.2500
##   1668.1442_8.113 944.5705_8.116 822.5616_8.116 820.562_8.117 960.5481_8.117
## 2       5463.8247     13576.0260     37789.9770    85715.2500     24214.5020
##   847.5799_8.118 898.5782_8.119 853.6428_8.12 882.5533_8.121 883.5565_8.118
## 2     12919.2750     89561.4300    24748.5620     37676.0900     19931.1780
##   716.5225_8.139 888.549_8.143 914.5514_8.091 950.5333_8.144 890.5493_8.144
## 2      7779.8290    23152.9470      9903.8900      9753.9375     10276.3010
##   1028.5349_8.145 724.5277_8.141 966.5651_8.147 724.5275_8.142 790.5382_8.16
## 2       8666.2690      7835.7803     18252.3700      7835.7803    21106.9320
##   789.6116_8.177 840.6105_8.214 762.5643_8.206 856.6051_8.21 582.5094_8.227
## 2     11812.9610      4544.3486     18487.7930    13209.3460     10990.9070
##   572.4806_8.229 574.4787_8.23 838.5955_8.279 748.5276_8.299 724.5276_8.3
## 2     21580.7810     7488.7440      8260.9810      8657.7880    4696.7030
##   835.5322_8.336 764.5798_8.343 818.5906_8.346 862.5953_8.355 909.5492_8.36
## 2     16368.2705     15757.4500     17764.0410      6502.1250     8638.5590
##   902.5128_8.383 774.5431_8.358 824.4968_8.383 834.5254_8.385 766.5385_8.385
## 2      4093.0002      2007.0992      8713.0370     16660.0000    102631.6000
##   864.5064_8.385 788.58_8.386 815.627_8.417 736.5275_8.432 1669.2155_8.46
## 2      8448.3670   22432.6460     9359.7300      4345.7607      1621.7545
##   1668.2129_8.463 840.6112_8.445 810.5275_8.448 841.6406_8.452 976.5477_8.457
## 2       2019.3225      9788.1990     33076.2660     11286.6170      3996.8179
##   914.5643_8.457 848.577_8.458 846.5774_8.459 986.5637_8.459 908.5688_8.459
## 2      9376.7980    11834.7740     28534.2230      8202.1890     13272.8750
##   992.5806_8.459 924.5935_8.459 970.5858_8.459 856.6068_8.46 873.5954_8.46
## 2      6013.5340     27763.8200      5290.1294   152973.2700     5111.0654
##   742.5383_8.471 792.5536_8.473 1697.1555_8.491 885.5495_8.509 790.5953_8.511
## 2     33108.3300      5459.1440       2762.2256    219215.0300     23723.5000
##   953.536_8.516 1015.5064_8.516 880.6062_8.517 983.5161_8.518 1021.5212_8.523
## 2    26731.9820       7852.9300     12420.5690     12558.5250       8244.5660
##   943.5073_8.524 1005.4968_8.528 864.6108_8.544 828.5668_8.612 838.5956_8.612
## 2     11931.8100      10613.6810      4830.8320      5983.6357     25094.9750
##   906.5828_8.614 929.5358_8.639 861.5489_8.641 911.5645_8.686 793.5985_8.748
## 2      5728.3066      6024.2460     37498.0820      4402.3364     19151.1910
##   803.6275_8.749 750.5432_8.694 871.6147_8.752 844.6062_8.707 814.5957_8.732
## 2    103716.1600     12871.6200     20451.3440      5184.2810     13738.5530
##   806.5905_8.734 806.5895_8.732 804.6308_8.768 855.59_8.755 861.5846_8.743
## 2     18060.4510     17002.6970     49662.9960   12279.3850     10165.6400
##   795.5979_8.768 793.5985_8.765 842.5306_8.773 774.5433_8.775 803.6275_8.771
## 2      9425.6810     21094.1760      5530.6550     35749.2460    103716.1600
##   871.6147_8.768 933.5855_8.781 840.6113_8.8 830.5838_8.802 908.5977_8.803
## 2     20451.3440      6936.8920   35263.4140      7860.8755      8485.7410
##   700.5277_8.805 819.6141_8.816 829.6431_8.816 821.6152_8.817 856.6029_8.818
## 2      8064.3228     12680.5370     59890.4530      5772.9780      8446.2010
##   887.599_8.816 768.554_8.827 804.6307_8.782 882.6209_8.855 872.5955_8.863
## 2     5530.6300     6555.8037     49662.9960     14926.7080      3023.7730
##   950.6082_8.859 866.6268_8.879 800.5587_8.868 816.6106_8.908 968.581_8.937
## 2      3764.7932      8463.0010      2290.4570      9929.1650     6303.9160
##   946.5851_8.939 824.5771_8.938 962.5631_8.939 890.5649_8.939 900.5936_8.939
## 2      4725.8300     11668.0690      7632.1910     10249.5800     28638.6050
##   832.6067_8.94 884.5687_8.94 822.5774_8.941 897.6305_9.024 829.6432_9.024
## 2   144460.3400    13710.0490     27029.8960     28433.5620    172523.2500
##   881.6055_9.023 819.6141_9.024 959.6018_9.026 1561.2028_9.038 821.6139_9.026
## 2     13610.3370     29945.2170      9545.7750       3594.8525     13116.5080
##   887.5991_9.03 847.6304_9.032 903.5878_9.033 855.6591_9.033 969.6384_9.033
## 2     9205.0660     16887.5350      6131.2227    210398.3100      6098.1714
##   985.616_9.034 991.6331_9.034 907.6211_9.035 923.646_9.035 913.6162_9.035
## 2     9650.0480      8398.3180     20509.0880    40109.9450     13624.2880
##   845.6298_9.037 750.5436_9.042 818.5306_9.045 848.5114_9.046 808.5018_9.051
## 2     40144.5350    111689.3300     14247.4610      7089.5356      6832.3794
##   888.5678_9.068 887.5646_9.068 776.5589_9.132 726.5434_9.157 794.5306_9.158
## 2     14691.8460     23708.0700     13893.1800     22353.0000      4055.4963
##   858.622_9.163 858.6217_9.164 752.5589_9.222 805.6426_9.222 831.6576_9.28
## 2    11971.4860     12272.2260      5368.9220      5129.8857     4040.8533
##   744.5538_9.321 833.6294_9.395 843.6586_9.396 911.6461_9.397 875.6844_9.397
## 2      7145.4883      9015.5790     34686.9000      7792.0415      6487.9380
##   788.5437_9.413 817.643_9.423 885.6305_9.426 807.6141_9.427 887.5646_9.463
## 2     18918.1290    35230.9020      8296.1730      8985.0670      3790.0000
##   600.5119_9.48 752.5591_9.514 857.6737_9.513 931.5514_9.582 863.5644_9.582
## 2     6794.8594      3570.4470      4379.6440      2323.0913     10587.6030
##   911.6459_9.666 901.6169_9.665 895.6211_9.665 833.6297_9.665 843.6587_9.666
## 2     13474.3500      6688.2840      9071.0300     16480.4040     60810.8400
##   911.646_9.667 1016.7241_9.858 983.6184_9.976 778.5744_9.917 889.617_9.974
## 2    13474.3500       4702.8150      5785.7030      7963.8535    13294.1490
##   945.6385_9.975 967.6322_9.976 1670.349_9.987 883.6211_9.976 821.6298_9.976
## 2      5831.8623      8264.8240      4279.3145     18760.4040     40503.6700
##   961.6178_9.977 899.6459_9.978 823.6294_9.979 831.659_9.98 1644.3337_9.984
## 2     11646.7640     41054.9000     16734.7930  224299.7700       6377.4263
##   993.6488_9.986 857.6749_9.986 971.6542_9.988 915.6319_9.987 987.6318_9.987
## 2     10976.1170    269686.7000      7963.2510     17955.4840     12177.7780
##   925.6617_9.988 847.6455_9.988 849.6462_9.988 917.6329_9.989 874.6643_9.99
## 2     48529.5470     49363.0980     23903.6820      7906.3354     7891.7890
##   905.6028_9.99 909.6368_9.99 931.6162_9.992 983.6185_9.993 728.5589_10.045
## 2     8745.6600    23330.1390      5534.3560      5785.7030       5464.5327
##   931.6162_9.999 653.491_10.071 1261.8136_10.084 1235.798_10.088 894.658_10.086
## 2      5534.3560      5309.9985        6648.7560       6083.2900      6683.0166
##   860.6369_10.19 778.5745_10.284 993.6487_10.29 925.6615_10.291 915.6327_10.293
## 2      4347.8887      16747.3610      9180.6270      42885.4570      17120.4940
##   917.633_10.292 857.6746_10.294 849.6458_10.294 967.594_10.294 931.6164_10.288
## 2      8375.1450     227623.8600      29497.3280      8381.0640       5103.2144
##   909.6366_10.295 847.6455_10.298 905.6039_10.298 874.6642_10.298
## 2      31145.9860      68079.2300      10383.8000      12174.1120
##   920.6735_10.31 871.6891_10.337 939.6769_10.335 923.6524_10.353
## 2     11407.9310      23431.1900       4883.7890       4365.2290
##   1261.8135_10.352 754.5745_10.357 833.6742_10.379 860.6919_10.384
## 2        6244.3438       5013.8345      22248.7150      13928.9730
##   823.6447_10.383 818.6271_10.414 828.6559_10.414 820.627_10.414
## 2      10651.2940      49472.2970      36236.8240     24093.9380
##   854.6714_10.418 1646.3475_10.439 904.6327_10.443 913.6613_10.438
## 2      23159.9770        3366.3650      10757.5170      28688.9120
##   1637.3241_10.442 845.6746_10.439 1636.3208_10.44 903.6327_10.442
## 2        4831.9707     248822.1400       6311.0030      18021.2300
##   897.637_10.442 905.6301_10.443 837.6454_10.443 835.6457_10.444 862.664_10.445
## 2     38940.5000       8713.7110      52024.6130     129008.8500     25511.1270
##   955.5948_10.447 920.6223_10.449 893.604_10.45 895.6025_10.452 816.5752_10.467
## 2       9650.6110       7492.4640    18636.5270      13528.3820       5412.6943
##   1249.8137_10.468 638.5721_10.489 628.5437_10.491 630.5417_10.49
## 2        8322.1470      11466.0350      21496.6580      7993.3060
##   1279.8241_10.52 1018.7397_10.524 1008.7111_10.525 654.5589_10.54
## 2       8390.5910        5776.7700        7643.0054     26564.1640
##   656.5586_10.54 664.5877_10.541 682.5753_10.545 680.5744_10.545 707.593_10.547
## 2     10790.8170      15001.5730      15388.2230      33780.4060      8583.8650
##   690.603_10.546 936.6574_10.551 832.6428_10.551 842.6715_10.551
## 2     16967.4600       4246.1646      43308.2800      19995.1740
##   946.6887_10.548 837.6571_10.552 864.6677_10.558 1263.8295_10.575
## 2       3736.5776       5951.1045      12317.8480       17800.0550
##   885.7055_10.58 862.6535_10.583 872.6815_10.583 911.652_10.584 1675.384_10.589
## 2      5392.2827       8905.0270       6678.5770     34630.8320       6900.4870
##   969.6092_10.587 1674.3803_10.59 1666.3553_10.589 859.6907_10.59
## 2       6806.5720       5760.7236        9989.0205    372254.8400
##   849.6616_10.589 1665.3553_10.589 927.677_10.59 876.68_10.59 851.6615_10.59
## 2     232448.1600       12303.3290    27190.5470   45172.9530     98275.5900
##   917.6482_10.589 1664.3521_10.59 919.6483_10.59 907.6204_10.599 909.6189_10.6
## 2      18074.4650      10063.3940      8632.1950      22921.6370    15571.6400
##   934.6384_10.6 912.6573_10.608 652.5879_10.611 642.5594_10.614 806.6057_10.613
## 2     9350.6690      26177.1800       7656.0300       9989.4400       4466.7417
##   922.6891_10.613 896.6737_10.623 914.6592_10.621 970.6153_10.616
## 2      13885.9320       7693.4927       8838.5730       5592.2676
##   886.645_10.627 856.6871_10.641 874.6819_10.641 846.6588_10.643
## 2      6484.7970      41352.6370       9696.1890     105766.6250
##   908.6381_10.644 695.5929_10.644 678.6034_10.645 904.6171_10.646
## 2      11053.4410       6063.0550      12335.3310       8930.5090
##   670.5743_10.646 668.5747_10.647 853.619_10.659 865.6758_10.678
## 2       7433.1140      18218.1840      7036.0166       7932.8877
##   863.6765_10.683 851.6659_10.671 658.5736_10.694 656.575_10.694
## 2      17536.2340      16954.3140      50116.9900    136334.9000
##   666.6032_10.695 744.5811_10.699 684.591_10.697 682.5904_10.698
## 2      80462.1950       5573.4940     47335.4700     121164.5300
##   692.6191_10.698 709.609_10.707 640.5796_10.729 676.6243_10.731
## 2      66447.8000     23455.6050       2462.6406       3118.6467
##   696.6064_10.749 706.6345_10.754 658.5898_10.758 660.5885_10.757
## 2      11036.6760       7231.1826      23411.7600       8107.9395
##   668.6174_10.756 855.6346_10.759 698.6108_10.776 697.6094_10.776
## 2      15633.9460       8517.0140      12544.2450      27215.1540
##   670.5906_10.779 680.6191_10.777 672.5896_10.777 674.6039_10.834
## 2     125584.6700      62872.6900      44991.6500       5083.6850
##   682.6332_10.835 1335.245_10.854 694.635_10.854 684.6065_10.853
## 2       9162.7830       4942.8203    245587.0300     354283.5000
##   686.6054_10.854 746.5966_10.853 1334.2417_10.855 762.6216_10.854
## 2     148661.9800      11560.1420        5303.9520       4838.7534
##   711.6251_10.854 652.6239_10.859 678.6402_10.885 668.611_10.888
## 2      61655.1900       3495.9722       5296.9190      3014.2336
##   698.6217_10.912 700.6211_10.914 708.6502_10.915 686.6207_10.914
## 2      34974.1330      15591.5400      20487.3600      31390.2580
##   697.653_10.915 688.6203_10.915 696.6498_10.915 725.6412_10.916
## 2     11392.3330      12834.5340      21661.5210       8151.1580
##   722.6659_11.002 680.6552_11.016 960.7412_11.038 986.7566_11.049
## 2       5985.1500       3538.8257       9043.6290      11070.3710
##   988.7722_11.162 1014.7875_11.17
## 2      11237.9790       6091.9590
# change to results to numeric
data_notame <- data_notame %>%
  mutate_at(-1, as.numeric)

head(data_notame, n = 1)
##                        mz_rt 272.9587_0.485 288.9363_0.485 226.9658_0.499
## 2 x5101_b1_control_c18neg_82       11986.55        21534.9       28760.87
##   294.9532_0.5 362.9406_0.501 520.9099_0.514 588.8973_0.514 452.9225_0.515
## 2     22338.56       34403.13       114667.8       98069.39       102553.1
##   656.8848_0.515 724.8722_0.515 792.8596_0.515 384.9351_0.516 316.9477_0.518
## 2          59992       46757.65       28809.44       97462.69       129814.3
##   604.8712_0.518 248.9604_0.52 215.0328_0.588 217.0297_0.589 151.0261_0.612
## 2       43247.65      139909.2       423488.8       147959.5       1008.062
##   335.0471_0.599 649.1192_0.601 167.021_0.602 665.0885_0.607 643.1067_0.611
## 2       89597.61       17832.48      169550.4       17469.22       21769.13
##   627.1374_0.611 329.0355_0.613 621.1249_0.613 459.1113_0.613 935.1964_0.613
## 2       35917.11       44170.43       19929.61        12582.8       6787.081
##   919.2277_0.616 605.1555_0.616 313.0652_0.617 291.0839_0.618 128.0352_0.617
## 2       9664.962       76629.05       232746.5        1622795       35370.36
##   583.1735_0.618 247.0933_0.62 293.0879_0.621 191.0197_0.621 111.0086_0.62
## 2       16841.32      30654.05       35340.32       643951.4      150325.2
##   950.1575_0.623 636.085_0.627 658.0669_0.628 680.0486_0.63 389.052_0.635
## 2       3818.781      17712.38       17415.88      6436.066      23057.95
##   263.1035_0.638 277.0734_0.639 343.9948_0.639 172.9913_0.642 187.0418_0.642
## 2        66218.5       41315.56       216509.7       115296.6       209861.1
##   187.0515_0.642 345.9989_0.642 300.0047_0.643 201.0575_0.644 188.9862_0.644
## 2       14098.11           6601       23712.52       48690.59       9552.884
##   89.0243_0.645 230.9967_0.644 93.0344_0.646 178.0509_0.647 479.0972_0.649
## 2      239368.4       1436.521      31256.66       23041.92       31571.95
##   103.04_0.651 462.1763_0.655 187.007_0.66 203.0013_0.66 107.0502_0.661
## 2     48823.08       3000.788     600991.2      7830.959       110424.4
##   194.0457_0.66 255.0871_0.663 383.1529_0.667 187.0165_0.665 117.0557_0.669
## 2      3220.508       8777.292       1042.219       16411.95       56197.16
##   291.0953_0.67 245.0486_0.685 352.0856_0.687 201.0226_0.688 413.1998_0.688
## 2      15675.74       17020.85       8563.765       1560.347       6060.373
##   437.0542_0.688 510.2523_0.688 624.3379_0.689 514.2836_0.69 213.0223_0.689
## 2        1315.98       6418.269       6967.838      504.0312        3920.36
##   397.1781_0.69 129.0557_0.69 367.1581_0.691 257.0795_0.669 528.2631_0.691
## 2      13469.26      126977.6        36765.1       504.0312         7024.1
##   231.0795_0.662 397.2049_0.693 229.0537_0.703 244.908_0.706 246.9051_0.707
## 2       1033.337       10682.89       1605.157      28453.58       26781.31
##   369.1735_0.722 137.0244_0.741 624.3382_0.91 239.0923_0.975 464.3013_0.999
## 2       16647.08       2228.712      2404.195       13168.31       504.0312
##   241.0868_1.048 448.3063_1.326 453.285_1.371 583.2555_1.358 448.3062_1.477
## 2       504.0312       2249.928      504.0312       8213.148       2152.334
##   267.1235_1.539 507.223_1.7 437.2904_2.11 586.3143_2.221 391.2849_2.246
## 2       14312.37    28249.83      2109.412       7916.017       7834.511
##   562.3143_2.27 507.223_2.273 297.1527_2.281 512.2988_2.28 311.2224_2.465
## 2      6131.514      5463.416       4852.787      18104.64       4982.177
##   538.3144_2.488 449.254_2.573 612.33_2.594 640.2923_2.673 656.3173_2.673
## 2       26836.06      3670.256     27236.77       8631.628       11211.98
##   578.3011_2.673 588.3302_2.677 526.3144_2.683 311.1683_2.682 1107.6619_2.7
## 2       11934.06       156921.7       14725.99       10671.61      6479.082
##   517.2436_2.68 524.2776_2.71 830.5005_2.723 1151.649_2.727 504.3089_2.726
## 2      504.0312      17717.52       1502.127       2805.045       18348.54
##   564.3308_2.727 1135.6242_2.73 556.299_2.728 694.2877_2.728 1083.6621_2.728
## 2         396450        2101.62      10870.73       11570.62        15289.02
##   616.2924_2.728 554.3012_2.728 1073.6331_2.728 632.3174_2.729 1602.9935_2.726
## 2       20911.83       28204.33        3184.225       25367.39        1053.242
##   619.2886_2.757 500.2777_2.802 614.3455_2.824 476.2777_2.847 590.3457_2.989
## 2       12485.94       35047.24       7444.078       27902.56       39904.79
##   1521.9681_3.075 670.2878_3.073 1165.6197_3.074 532.2989_3.075 530.3013_3.075
## 2        2808.471       21550.03        6353.824       23154.22       62886.28
##   1025.6334_3.075 592.2925_3.075 540.3313_3.076 608.3174_3.076 1035.6627_3.076
## 2        12987.27       42669.53        1157628        52637.3        93593.68
##   654.31_3.076 1103.6493_3.076 480.309_3.076 1087.6246_3.076 1531.9972_3.076
## 2      8150.14        14690.84      47245.85        10563.33        7595.639
##   1520.9647_3.076 1027.6336_3.076 1530.994_3.076 1598.9806_3.076
## 2         3523.74        6002.621       10113.03        2481.021
##   1315.8467_3.079 820.5155_3.079 1061.6776_3.089 452.2777_3.197 618.308_3.232
## 2        504.0312       2857.127         7589.48       23911.54      14584.35
##   634.3329_3.232 506.3245_3.232 566.3462_3.232 556.3168_3.233 696.3033_3.233
## 2        20147.4       10277.21       273539.3       25799.98       7031.487
##   1087.6933_3.233 558.3148_3.234 478.2933_3.354 524.3351_3.376 526.3505_3.4
## 2        7558.609       8811.278       16215.15       21914.58     18850.23
##   592.3612_3.407 554.3456_3.441 436.2827_3.522 552.3663_3.532 698.3189_3.775
## 2       7309.226       20630.93       13906.46       11245.39       8278.129
##   1159.7117_3.776 1081.6957_3.777 508.3402_3.777 568.3621_3.777 620.3237_3.777
## 2         4318.52        5479.515       16299.13       532299.4       24095.65
##   1143.6869_3.778 636.3486_3.777 558.3325_3.778 1091.7248_3.778 626.3198_3.778
## 2        3467.048       39472.61       42671.38        21538.79          10507
##   560.3303_3.778 1615.0859_3.778 594.3768_3.858 480.309_3.883 599.3194_3.921
## 2       14168.75        2119.961       6830.728      45650.44        15658.1
##   583.2554_3.939 605.2373_3.94 1167.518_3.94 554.3818_4.037 414.0583_4.043
## 2       23206.53      6507.553      5111.501       7755.415       8064.445
##   253.2169_4.044 327.2325_4.055 511.3996_4.087 464.314_4.127 303.2326_4.149
## 2       3715.852       40238.29       3120.451      17825.38       43368.23
##   440.0739_4.207 442.071_4.208 279.2327_4.208 444.0682_4.208 559.4722_4.208
## 2        56946.7      46998.21         129523       17429.46        8758.29
##   463.3422_4.219 537.4153_4.24 539.4304_4.266 539.4306_4.266 573.4515_4.266
## 2        4484.45      33903.05       13237.36       13237.36       11812.46
##   445.3316_4.28 467.3735_4.306 591.462_4.314 445.3316_4.415 539.4309_4.416
## 2      16675.65        24954.8      5188.547       22877.84       10927.55
##   511.3997_4.453 447.3471_4.499 493.389_4.514 447.3471_4.631 473.3629_4.632
## 2       3652.242       11653.17       5953.37        11625.7        5888.98
##   567.4621_4.643 446.0838_4.646 444.0866_4.647 281.2484_4.648 442.0896_4.647
## 2       4465.416       19138.68       50135.16       200246.8       51583.44
##   563.5036_4.648 591.462_4.651 449.3627_4.663 593.4778_4.664 575.467_4.662
## 2       23532.04      6583.166       9165.393       35374.88      3355.543
##   473.3474_4.696 425.363_4.712 441.3942_4.718 491.3733_4.784 818.5544_4.825
## 2       504.0312      12562.76       4651.295       4547.798       504.0312
##   551.3582_4.841 573.4515_4.873 561.3787_4.908 577.3738_4.918 617.4753_4.956
## 2       1659.143       5616.502        8191.66       5274.489       3398.378
##   595.4933_4.953 691.5022_4.977 495.4046_4.993 397.3681_5 717.5179_5.106
## 2       23644.17       11188.64        4821.53   6125.191       27211.07
##   465.3192_5.112 465.3038_5.114 591.3894_5.174 705.5178_5.308 479.3193_5.338
## 2       8263.396       110951.5        11246.6       6977.324       6625.671
##   575.4672_5.354 411.3837_5.349 605.4051_5.422 579.3893_5.557 878.584_5.681
## 2       3909.946       7838.022       6459.481       2674.295       4946.87
##   1394.0685_5.684 787.5209_5.683 709.5047_5.684 719.534_5.684 771.4961_5.685
## 2        4091.168       22534.19       23499.24      222421.6       10974.93
##   711.5035_5.685 849.4911_5.685 493.3349_5.699 722.4967_5.728 904.599_5.836
## 2       9168.952       6182.067       10544.26       3234.964      6464.149
##   1447.1028_5.846 1446.0998_5.845 875.5066_5.845 735.5203_5.846 813.5365_5.846
## 2        8393.435           10199        9896.56       37915.44       33982.08
##   737.5193_5.846 745.5498_5.846 859.5292_5.846 803.5076_5.847 797.5117_5.847
## 2       15724.55       381718.7        6394.41       11439.64       18180.04
##   1271.7465_5.862 848.5434_5.871 822.5279_5.875 748.5122_5.882 824.5433_5.925
## 2        9264.096       5360.774       6334.904       3378.671       5833.091
##   818.554_5.972 818.5539_5.971 721.5493_6 721.549_6 848.5433_6.017
## 2      6304.449       9040.824   8293.607  8293.607       5426.512
##   798.5279_6.032 733.5494_6.091 801.5366_6.09 723.5203_6.092 765.5735_6.098
## 2          26310         126621      13265.09       15401.53       6608.726
##   771.5646_6.096 764.4992_6.1 842.5154_6.099 774.5282_6.1 898.559_6.11
## 2       12778.72     5535.021       6602.767     55365.67     3685.277
##   763.5596_6.181 1068.6675_6.19 801.547_6.254 790.5149_6.254 800.5438_6.256
## 2       13917.59       13256.23      26554.42       8090.822        54200.4
##   868.531_6.255 874.559_6.259 759.5646_6.287 836.5434_6.295 557.4566_6.309
## 2       7316.04      9442.575       9749.275       8236.619       8280.588
##   1605.0902_6.358 1604.0878_6.358 882.5021_6.358 824.5441_6.359 814.5148_6.359
## 2         2503.24         1919.88       6036.377       157509.5          18936
##   892.531_6.359 816.5151_6.359 876.5059_6.36 954.5018_6.361 840.5304_6.407
## 2      16966.92       7578.475      9698.033       5114.851       8459.321
##   850.5595_6.407 790.5148_6.407 918.5466_6.408 800.5433_6.41 868.5308_6.41
## 2       65896.51       6673.638       8493.985      57832.41      6448.348
##   801.547_6.409 812.5436_6.468 884.518_6.476 879.5263_6.489 816.5318_6.478
## 2      29100.63       21515.13      4892.302       5314.663       13349.54
##   818.5302_6.479 956.5168_6.479 894.5465_6.48 1608.119_6.481 826.5598_6.482
## 2       5292.869       4111.511      12525.57       1456.658       111413.3
##   878.5241_6.495 1530.1292_6.506 1529.1254_6.507 896.5849_6.505 906.6148_6.513
## 2       15045.64        7696.467        7073.613       5749.305       25188.61
##   1519.1193_6.539 1491.1091_6.544 747.5662_6.538 1450.1318_6.54 1441.1057_6.541
## 2        10325.66        3698.703        1126504       65371.41        11406.08
##   1518.1184_6.541 1502.0921_6.54 739.5351_6.541 1440.1025_6.541 861.5449_6.542
## 2        12439.59       7361.131       34892.36         13591.3       12531.68
##   799.5274_6.542 831.526_6.542 764.5548_6.543 737.5362_6.543 815.5524_6.543
## 2       40890.11      7634.138       12854.44       91910.27       83607.65
##   877.5224_6.543 1503.101_6.546 788.5437_6.549 805.5234_6.55 883.5394_6.551
## 2       23042.73       8019.273       27396.09      19062.66       13138.25
##   945.5095_6.552 1451.1351_6.539 801.5445_6.55 800.5402_6.543 750.528_6.591
## 2        7267.68        57017.04       18246.8       35417.13      27264.17
##   820.5694_6.598 784.549_6.62 1151.7045_6.635 838.5592_6.651 876.5748_6.674
## 2       5591.081     504.0312        16743.68       3385.642        5824.52
##   814.5592_6.699 773.5806_6.749 763.5516_6.749 841.5661_6.75 1579.1408_6.75
## 2       5335.243       156829.2       17065.55      17132.06       7385.766
##   1656.1198_6.753 850.5603_6.753 1582.1048_6.758 842.5312_6.754 1657.1231_6.754
## 2        8507.573       383956.2        3297.011       17908.62        8909.086
##   853.572_6.759 1646.0906_6.756 840.5306_6.756 902.5217_6.756 867.5493_6.755
## 2      16663.19        2485.114       41751.77        22894.2       6170.334
##   986.5339_6.756 918.5467_6.756 964.5391_6.756 970.4999_6.757 908.5177_6.758
## 2       8439.843        40072.3       5975.645       5105.914       13004.34
##   980.5167_6.758 776.5438_6.762 1647.0986_6.756 844.5327_6.766 766.5148_6.768
## 2       11173.48       87543.61        2520.822       13258.05       8478.303
##   828.5061_6.771 808.5482_6.817 546.1884_6.859 550.1831_6.859 545.3463_6.86
## 2       5257.792       2870.934       30991.66       10394.85      24574.53
##   519.347_6.861 548.1856_6.861 557.457_6.865 559.4719_6.867 543.3083_6.873
## 2      18584.63       31491.55      3774.552       4240.579       8250.871
##   560.2269_6.891 561.2272_6.889 876.5748_6.891 473.3439_6.896 739.5515_6.896
## 2       5078.923       5696.802       8479.144       10678.18       11276.66
##   645.4854_6.897 749.5806_6.906 749.5804_6.907 816.5308_6.915 818.5304_6.915
## 2       6815.698       23554.26       23554.26       92555.02       35193.77
##   946.5031_6.923 843.5493_6.926 884.518_6.929 1600.0951_6.94 962.534_6.937
## 2       8240.493       11779.99       15864.8       7945.235      9319.645
##   878.522_6.938 1599.0952_6.94 1598.0913_6.94 894.5469_6.945 1676.1068_6.945
## 2      34961.79       9671.229       9272.736       70189.63         8662.03
##   956.5171_6.945 940.5392_6.946 1677.1104_6.945 1608.1204_6.95 1609.1238_6.95
## 2       21859.58       10560.02        7693.579       37296.64       38017.94
##   826.5606_6.953 886.5195_6.961 1660.08_6.945 810.5642_6.968 1575.0947_6.977
## 2       828296.4       6658.617      4503.866       2061.912        6851.553
##   1652.1073_6.976 1574.0913_6.977 1584.1204_6.981 1585.1238_6.981
## 2         7466.52        8431.153        34260.91        33486.19
##   795.5319_7.041 1561.1246_7.026 802.5612_7.026 1560.1212_7.025 871.5502_7.054
## 2       14637.81        87123.47        1357794        96113.17       41827.15
##   1551.0949_7.03 1628.1079_7.03 1550.0916_7.031 1629.1111_7.028 917.5422_7.049
## 2       14490.15        14638.6        13662.68        12221.65       8263.755
##   1612.0825_7.034 792.5308_7.046 794.5298_7.047 916.5393_7.053 1610.1346_7.034
## 2        7057.534       86525.65        35337.6       12739.03        22415.33
##   761.5803_7.053 932.5173_7.054 1611.1384_7.055 854.522_7.057 870.547_7.057
## 2       19171.08       23813.22        9165.053      34324.86      84686.48
##   1520.0675_7.067 886.5199_7.016 762.507_7.071 860.5179_7.078 938.534_7.079
## 2        3811.919       8245.688      32796.75       15533.79       10826.1
##   922.5024_7.08 1000.5039_7.081 852.5752_7.104 844.5463_7.11 920.5621_7.108
## 2      7704.432         7322.02       120860.1      6777.977       14412.58
##   842.546_7.109 904.5364_7.114 1586.1348_7.163 878.5901_7.193 720.4962_7.178
## 2      14882.37       7048.357        3374.409        4193.56       5568.113
##   830.5815_7.188 1613.1542_7.188 942.5549_7.193 896.5624_7.191 958.5324_7.191
## 2       39760.63        4131.959       6944.338       34076.44          10640
##   818.5462_7.192 1612.1504_7.187 880.5375_7.198 828.5759_7.19 820.5463_7.196
## 2       34030.33        4982.682       16646.36        269665       14294.41
##   886.5328_7.202 948.5172_7.192 964.5495_7.201 881.5397_7.202 1602.121_7.207
## 2       11507.06        4908.63       8291.848       9636.184        1752.13
##   788.5223_7.225 834.5643_7.242 881.5332_7.243 807.5001_7.254 790.5593_7.252
## 2        3845.78       16588.37       7665.895       5144.873       25775.37
##   864.5747_7.263 738.507_7.269 806.4942_7.271 746.5118_7.267 878.5903_7.305
## 2       7477.013      39627.31       5332.414        3596.26       7596.104
##   840.5749_7.321 1602.1228_7.339 948.5173_7.337 886.5331_7.335 897.5657_7.337
## 2       16394.42        3432.839       8086.667          16540       28673.65
##   1026.5195_7.338 964.5495_7.339 818.5462_7.337 958.5325_7.337 942.5548_7.339
## 2        7702.331       12165.59       55049.56       15019.36       9148.164
##   1603.1254_7.34 880.5376_7.34 828.5759_7.339 896.5624_7.34 820.5462_7.34
## 2       4002.357      25622.81       430864.8      51577.68      22564.87
##   1612.1508_7.34 845.5636_7.343 1637.1538_7.351 1613.1545_7.34 912.5357_7.346
## 2       10090.17       8650.325        3598.205        10747.9       5677.158
##   714.507_7.348 1636.1506_7.352 920.5621_7.373 854.5867_7.421 881.5405_7.337
## 2      21358.97        3177.651       9580.489        18861.1       12995.19
##   852.5752_7.369 842.546_7.377 904.5361_7.374 843.5493_7.379 836.5799_7.404
## 2       69645.93      9225.879       5982.632       5791.627       12651.91
##   764.5225_7.43 857.5176_7.442 800.5354_7.468 810.5647_7.467 878.5516_7.469
## 2      12744.66       32854.14       17461.85       132522.2       17583.55
##   840.5749_7.471 862.527_7.471 868.5303_7.476 862.5261_7.47 800.5357_7.469
## 2       30003.94      10110.18       6806.371      10110.18       17461.85
##   922.5767_7.503 854.5896_7.505 740.5225_7.515 833.5175_7.518 855.5937_7.505
## 2       5766.143       29425.29       7085.379       24162.94       17361.94
##   862.5953_7.53 884.5607_7.548 776.5354_7.574 816.5751_7.553 806.5463_7.553
## 2      7405.017       8423.698        11808.4       44148.65       6009.256
##   833.5544_7.557 884.5587_7.554 843.5839_7.561 767.5664_7.562 905.5552_7.563
## 2       10528.56       7110.306       32967.96       12791.67       10971.17
##   765.5672_7.563 775.5965_7.563 786.5646_7.575 854.5519_7.576 776.5351_7.576
## 2       32845.13       235038.5       73149.23       8554.003        11808.4
##   778.5595_7.588 768.5305_7.588 830.5218_7.589 846.5477_7.59 836.5799_7.605
## 2       106386.6       13095.34       6905.696      15131.24       24562.97
##   883.5333_7.614 746.5121_7.622 814.4993_7.622 812.5802_7.632 864.5398_7.662
## 2       6894.407       42279.55       5209.321       90708.62       7775.516
##   802.5529_7.634 880.5669_7.637 1179.7355_7.664 859.5339_7.699 855.5938_7.701
## 2       15428.46       14540.64        6533.578       4189.126       24039.59
##   764.5224_7.695 922.5774_7.695 854.5906_7.701 788.5795_7.719 856.5627_7.726
## 2       5594.565       7022.352       41821.79       29939.32       5997.815
##   828.5728_7.674 906.5814_7.742 838.5956_7.75 1598.1714_7.758 864.535_7.755
## 2       18499.06       7983.931      54082.33        5964.213      9644.078
##   883.5331_7.753 862.5335_7.761 940.5496_7.764 1616.1136_7.768 924.518_7.766
## 2       6612.639       20426.83       13661.23        4574.519      10243.37
##   888.5362_7.768 821.565_7.768 1633.1422_7.775 872.5626_7.769 1002.5196_7.769
## 2       7455.208      11493.69        8331.001       87200.16        6726.316
##   856.5377_7.769 918.5543_7.768 796.5458_7.771 1555.1258_7.773 934.5326_7.772
## 2        38901.9       13405.03       32951.06         8986.03       24030.76
##   794.5464_7.772 1554.1226_7.773 804.5762_7.774 918.5546_7.77 857.5409_7.768
## 2       84274.06        9048.828       816784.6      13405.03       20997.44
##   1564.1517_7.775 1632.139_7.776 1565.1551_7.774 772.5276_7.782 1639.1701_7.792
## 2        35523.35       7901.544        31104.63        13494.5        7250.444
##   1638.1667_7.792 878.5909_7.805 936.5439_7.803 1008.5435_7.813 870.5618_7.814
## 2        6213.194       86858.23       5752.748        4836.889       5132.105
##   946.5777_7.814 868.5616_7.814 930.5504_7.815 1482.0881_7.834 801.6117_7.833
## 2       11800.33       11311.25       5586.249        4683.703       72313.08
##   869.598_7.834 791.5828_7.838 824.5789_7.841 814.5949_7.87 864.6108_7.878
## 2      10249.83       12324.84        3535.81      13830.42       3409.736
##   722.5123_7.861 790.4993_7.863 820.4801_7.866 780.4705_7.867 814.595_7.869
## 2       115125.7       12781.59       6431.214       6948.083      13830.42
##   859.5338_7.864 814.5947_7.872 842.5905_7.891 827.6272_7.905 812.58_7.898
## 2       5668.923       13830.42       7701.905       22540.65     14386.56
##   789.6114_7.911 792.5765_7.938 698.5121_7.962 777.6118_7.986 1558.1192_8.016
## 2       5187.014       5050.927       17849.77       14208.75        3159.345
##   1052.5353_8.011 990.5651_8.013 974.5321_8.013 912.5491_8.014 748.5277_8.014
## 2        8414.304       12534.17       7662.098       20708.59       46733.69
##   906.5531_8.016 922.5781_8.016 871.5805_8.017 846.5617_8.018 1655.1569_8.02
## 2       29787.68        73024.2       10395.63       28928.26         5415.9
##   984.5483_8.018 1654.1535_8.02 938.5513_8.018 968.5707_8.019 844.562_8.02
## 2       18987.99       5260.174       5926.185       11094.87     72785.15
##   1665.186_8.021 854.5918_8.021 1664.1825_8.021 914.5508_8.03 724.5275_8.059
## 2        15773.8       597630.8        16215.74        9704.4       6238.598
##   1631.1566_8.057 814.5957_8.055 1630.1533_8.057 1641.1859_8.06 1640.1826_8.061
## 2        4667.314       6033.972        3949.361          11569        13329.37
##   1616.183_8.109 945.5734_8.118 1685.1732_8.11 830.5921_8.11 1617.1865_8.109
## 2       30387.21       9049.975       8840.793      810380.8        33352.45
##   1684.1698_8.112 1607.1572_8.113 1606.1538_8.113 880.6062_8.116
## 2        8998.021        9455.198        8503.058       24042.25
##   1668.1442_8.113 944.5705_8.116 822.5616_8.116 820.562_8.117 960.5481_8.117
## 2        5463.825       13576.03       37789.98      85715.25        24214.5
##   847.5799_8.118 898.5782_8.119 853.6428_8.12 882.5533_8.121 883.5565_8.118
## 2       12919.27       89561.43      24748.56       37676.09       19931.18
##   716.5225_8.139 888.549_8.143 914.5514_8.091 950.5333_8.144 890.5493_8.144
## 2       7779.829      23152.95        9903.89       9753.938        10276.3
##   1028.5349_8.145 724.5277_8.141 966.5651_8.147 724.5275_8.142 790.5382_8.16
## 2        8666.269        7835.78       18252.37        7835.78      21106.93
##   789.6116_8.177 840.6105_8.214 762.5643_8.206 856.6051_8.21 582.5094_8.227
## 2       11812.96       4544.349       18487.79      13209.35       10990.91
##   572.4806_8.229 574.4787_8.23 838.5955_8.279 748.5276_8.299 724.5276_8.3
## 2       21580.78      7488.744       8260.981       8657.788     4696.703
##   835.5322_8.336 764.5798_8.343 818.5906_8.346 862.5953_8.355 909.5492_8.36
## 2       16368.27       15757.45       17764.04       6502.125      8638.559
##   902.5128_8.383 774.5431_8.358 824.4968_8.383 834.5254_8.385 766.5385_8.385
## 2           4093       2007.099       8713.037          16660       102631.6
##   864.5064_8.385 788.58_8.386 815.627_8.417 736.5275_8.432 1669.2155_8.46
## 2       8448.367     22432.65       9359.73       4345.761       1621.755
##   1668.2129_8.463 840.6112_8.445 810.5275_8.448 841.6406_8.452 976.5477_8.457
## 2        2019.322       9788.199       33076.27       11286.62       3996.818
##   914.5643_8.457 848.577_8.458 846.5774_8.459 986.5637_8.459 908.5688_8.459
## 2       9376.798      11834.77       28534.22       8202.189       13272.88
##   992.5806_8.459 924.5935_8.459 970.5858_8.459 856.6068_8.46 873.5954_8.46
## 2       6013.534       27763.82       5290.129      152973.3      5111.065
##   742.5383_8.471 792.5536_8.473 1697.1555_8.491 885.5495_8.509 790.5953_8.511
## 2       33108.33       5459.144        2762.226         219215        23723.5
##   953.536_8.516 1015.5064_8.516 880.6062_8.517 983.5161_8.518 1021.5212_8.523
## 2      26731.98         7852.93       12420.57       12558.52        8244.566
##   943.5073_8.524 1005.4968_8.528 864.6108_8.544 828.5668_8.612 838.5956_8.612
## 2       11931.81        10613.68       4830.832       5983.636       25094.97
##   906.5828_8.614 929.5358_8.639 861.5489_8.641 911.5645_8.686 793.5985_8.748
## 2       5728.307       6024.246       37498.08       4402.336       19151.19
##   803.6275_8.749 750.5432_8.694 871.6147_8.752 844.6062_8.707 814.5957_8.732
## 2       103716.2       12871.62       20451.34       5184.281       13738.55
##   806.5905_8.734 806.5895_8.732 804.6308_8.768 855.59_8.755 861.5846_8.743
## 2       18060.45        17002.7          49663     12279.39       10165.64
##   795.5979_8.768 793.5985_8.765 842.5306_8.773 774.5433_8.775 803.6275_8.771
## 2       9425.681       21094.18       5530.655       35749.25       103716.2
##   871.6147_8.768 933.5855_8.781 840.6113_8.8 830.5838_8.802 908.5977_8.803
## 2       20451.34       6936.892     35263.41       7860.876       8485.741
##   700.5277_8.805 819.6141_8.816 829.6431_8.816 821.6152_8.817 856.6029_8.818
## 2       8064.323       12680.54       59890.45       5772.978       8446.201
##   887.599_8.816 768.554_8.827 804.6307_8.782 882.6209_8.855 872.5955_8.863
## 2       5530.63      6555.804          49663       14926.71       3023.773
##   950.6082_8.859 866.6268_8.879 800.5587_8.868 816.6106_8.908 968.581_8.937
## 2       3764.793       8463.001       2290.457       9929.165      6303.916
##   946.5851_8.939 824.5771_8.938 962.5631_8.939 890.5649_8.939 900.5936_8.939
## 2        4725.83       11668.07       7632.191       10249.58        28638.6
##   832.6067_8.94 884.5687_8.94 822.5774_8.941 897.6305_9.024 829.6432_9.024
## 2      144460.3      13710.05        27029.9       28433.56       172523.2
##   881.6055_9.023 819.6141_9.024 959.6018_9.026 1561.2028_9.038 821.6139_9.026
## 2       13610.34       29945.22       9545.775        3594.852       13116.51
##   887.5991_9.03 847.6304_9.032 903.5878_9.033 855.6591_9.033 969.6384_9.033
## 2      9205.066       16887.53       6131.223       210398.3       6098.171
##   985.616_9.034 991.6331_9.034 907.6211_9.035 923.646_9.035 913.6162_9.035
## 2      9650.048       8398.318       20509.09      40109.94       13624.29
##   845.6298_9.037 750.5436_9.042 818.5306_9.045 848.5114_9.046 808.5018_9.051
## 2       40144.54       111689.3       14247.46       7089.536       6832.379
##   888.5678_9.068 887.5646_9.068 776.5589_9.132 726.5434_9.157 794.5306_9.158
## 2       14691.85       23708.07       13893.18          22353       4055.496
##   858.622_9.163 858.6217_9.164 752.5589_9.222 805.6426_9.222 831.6576_9.28
## 2      11971.49       12272.23       5368.922       5129.886      4040.853
##   744.5538_9.321 833.6294_9.395 843.6586_9.396 911.6461_9.397 875.6844_9.397
## 2       7145.488       9015.579        34686.9       7792.042       6487.938
##   788.5437_9.413 817.643_9.423 885.6305_9.426 807.6141_9.427 887.5646_9.463
## 2       18918.13       35230.9       8296.173       8985.067           3790
##   600.5119_9.48 752.5591_9.514 857.6737_9.513 931.5514_9.582 863.5644_9.582
## 2      6794.859       3570.447       4379.644       2323.091        10587.6
##   911.6459_9.666 901.6169_9.665 895.6211_9.665 833.6297_9.665 843.6587_9.666
## 2       13474.35       6688.284        9071.03        16480.4       60810.84
##   911.646_9.667 1016.7241_9.858 983.6184_9.976 778.5744_9.917 889.617_9.974
## 2      13474.35        4702.815       5785.703       7963.854      13294.15
##   945.6385_9.975 967.6322_9.976 1670.349_9.987 883.6211_9.976 821.6298_9.976
## 2       5831.862       8264.824       4279.315        18760.4       40503.67
##   961.6178_9.977 899.6459_9.978 823.6294_9.979 831.659_9.98 1644.3337_9.984
## 2       11646.76        41054.9       16734.79     224299.8        6377.426
##   993.6488_9.986 857.6749_9.986 971.6542_9.988 915.6319_9.987 987.6318_9.987
## 2       10976.12       269686.7       7963.251       17955.48       12177.78
##   925.6617_9.988 847.6455_9.988 849.6462_9.988 917.6329_9.989 874.6643_9.99
## 2       48529.55        49363.1       23903.68       7906.335      7891.789
##   905.6028_9.99 909.6368_9.99 931.6162_9.992 983.6185_9.993 728.5589_10.045
## 2       8745.66      23330.14       5534.356       5785.703        5464.533
##   931.6162_9.999 653.491_10.071 1261.8136_10.084 1235.798_10.088 894.658_10.086
## 2       5534.356       5309.998         6648.756         6083.29       6683.017
##   860.6369_10.19 778.5745_10.284 993.6487_10.29 925.6615_10.291 915.6327_10.293
## 2       4347.889        16747.36       9180.627        42885.46        17120.49
##   917.633_10.292 857.6746_10.294 849.6458_10.294 967.594_10.294 931.6164_10.288
## 2       8375.145        227623.9        29497.33       8381.064        5103.214
##   909.6366_10.295 847.6455_10.298 905.6039_10.298 874.6642_10.298
## 2        31145.99        68079.23         10383.8        12174.11
##   920.6735_10.31 871.6891_10.337 939.6769_10.335 923.6524_10.353
## 2       11407.93        23431.19        4883.789        4365.229
##   1261.8135_10.352 754.5745_10.357 833.6742_10.379 860.6919_10.384
## 2         6244.344        5013.834        22248.72        13928.97
##   823.6447_10.383 818.6271_10.414 828.6559_10.414 820.627_10.414
## 2        10651.29         49472.3        36236.82       24093.94
##   854.6714_10.418 1646.3475_10.439 904.6327_10.443 913.6613_10.438
## 2        23159.98         3366.365        10757.52        28688.91
##   1637.3241_10.442 845.6746_10.439 1636.3208_10.44 903.6327_10.442
## 2         4831.971        248822.1        6311.003        18021.23
##   897.637_10.442 905.6301_10.443 837.6454_10.443 835.6457_10.444 862.664_10.445
## 2        38940.5        8713.711        52024.61        129008.9       25511.13
##   955.5948_10.447 920.6223_10.449 893.604_10.45 895.6025_10.452 816.5752_10.467
## 2        9650.611        7492.464      18636.53        13528.38        5412.694
##   1249.8137_10.468 638.5721_10.489 628.5437_10.491 630.5417_10.49
## 2         8322.147        11466.03        21496.66       7993.306
##   1279.8241_10.52 1018.7397_10.524 1008.7111_10.525 654.5589_10.54
## 2        8390.591          5776.77         7643.005       26564.16
##   656.5586_10.54 664.5877_10.541 682.5753_10.545 680.5744_10.545 707.593_10.547
## 2       10790.82        15001.57        15388.22        33780.41       8583.865
##   690.603_10.546 936.6574_10.551 832.6428_10.551 842.6715_10.551
## 2       16967.46        4246.165        43308.28        19995.17
##   946.6887_10.548 837.6571_10.552 864.6677_10.558 1263.8295_10.575
## 2        3736.578        5951.105        12317.85         17800.06
##   885.7055_10.58 862.6535_10.583 872.6815_10.583 911.652_10.584 1675.384_10.589
## 2       5392.283        8905.027        6678.577       34630.83        6900.487
##   969.6092_10.587 1674.3803_10.59 1666.3553_10.589 859.6907_10.59
## 2        6806.572        5760.724         9989.021       372254.8
##   849.6616_10.589 1665.3553_10.589 927.677_10.59 876.68_10.59 851.6615_10.59
## 2        232448.2         12303.33      27190.55     45172.95       98275.59
##   917.6482_10.589 1664.3521_10.59 919.6483_10.59 907.6204_10.599 909.6189_10.6
## 2        18074.47        10063.39       8632.195        22921.64      15571.64
##   934.6384_10.6 912.6573_10.608 652.5879_10.611 642.5594_10.614 806.6057_10.613
## 2      9350.669        26177.18         7656.03         9989.44        4466.742
##   922.6891_10.613 896.6737_10.623 914.6592_10.621 970.6153_10.616
## 2        13885.93        7693.493        8838.573        5592.268
##   886.645_10.627 856.6871_10.641 874.6819_10.641 846.6588_10.643
## 2       6484.797        41352.64        9696.189        105766.6
##   908.6381_10.644 695.5929_10.644 678.6034_10.645 904.6171_10.646
## 2        11053.44        6063.055        12335.33        8930.509
##   670.5743_10.646 668.5747_10.647 853.619_10.659 865.6758_10.678
## 2        7433.114        18218.18       7036.017        7932.888
##   863.6765_10.683 851.6659_10.671 658.5736_10.694 656.575_10.694
## 2        17536.23        16954.31        50116.99       136334.9
##   666.6032_10.695 744.5811_10.699 684.591_10.697 682.5904_10.698
## 2         80462.2        5573.494       47335.47        121164.5
##   692.6191_10.698 709.609_10.707 640.5796_10.729 676.6243_10.731
## 2         66447.8        23455.6        2462.641        3118.647
##   696.6064_10.749 706.6345_10.754 658.5898_10.758 660.5885_10.757
## 2        11036.68        7231.183        23411.76         8107.94
##   668.6174_10.756 855.6346_10.759 698.6108_10.776 697.6094_10.776
## 2        15633.95        8517.014        12544.25        27215.15
##   670.5906_10.779 680.6191_10.777 672.5896_10.777 674.6039_10.834
## 2        125584.7        62872.69        44991.65        5083.685
##   682.6332_10.835 1335.245_10.854 694.635_10.854 684.6065_10.853
## 2        9162.783         4942.82         245587        354283.5
##   686.6054_10.854 746.5966_10.853 1334.2417_10.855 762.6216_10.854
## 2          148662        11560.14         5303.952        4838.753
##   711.6251_10.854 652.6239_10.859 678.6402_10.885 668.611_10.888
## 2        61655.19        3495.972        5296.919       3014.234
##   698.6217_10.912 700.6211_10.914 708.6502_10.915 686.6207_10.914
## 2        34974.13        15591.54        20487.36        31390.26
##   697.653_10.915 688.6203_10.915 696.6498_10.915 725.6412_10.916
## 2       11392.33        12834.53        21661.52        8151.158
##   722.6659_11.002 680.6552_11.016 960.7412_11.038 986.7566_11.049
## 2         5985.15        3538.826        9043.629        11070.37
##   988.7722_11.162 1014.7875_11.17
## 2        11237.98        6091.959

Find connections

connection <- find_connections(data = data_notame,
                               features = features,
                               corr_thresh = 0.95,
                               rt_window = 1/60,
                               name_col = "mz_rt",
                               mz_col = "mz",
                               rt_col = "rt")
## [1] 100
## [1] 200
## [1] 300
## [1] 400
## [1] 500
## [1] 600
## [1] 700
## [1] 800
## [1] 900
## [1] 1000
head(connection)
##                x              y       cor rt_diff   mz_diff
## 1 191.0197_0.621  111.0086_0.62 0.9588214  -0.001  -80.0111
## 2 187.0418_0.642  89.0243_0.645 0.9844393   0.003  -98.0175
## 3 479.0972_0.649   187.007_0.66 0.9591729   0.011 -292.0902
## 4 479.0972_0.649 107.0502_0.661 0.9559836   0.012 -372.0470
## 5   187.007_0.66 107.0502_0.661 0.9879347   0.001  -79.9568
## 6  244.908_0.706 246.9051_0.707 0.9675337   0.001    1.9971

Clustering

clusters <- find_clusters(connections = connection, d_thresh = 0.8)
## 58 components found
## 
## 14 components found
## 
## 1 components found
# assign a cluster ID to all features. Clusters are named after feature with highest median peak height
features_clustered <- assign_cluster_id(data_notame, clusters, features, name_col = "mz_rt")

# lets see how many features are removed when we only keep one feature per cluster
pulled <- pull_clusters(data_notame, features_clustered, name_col = "mz_rt")
cluster_data <- pulled$cdata
cluster_features <- pulled$cfeatures

# how much did we trim our data down by?
nrow(omicsdata) - nrow(cluster_features)
## [1] 81
# export clustered feature list
write_csv(cluster_features,
          "Notame/notame-clustered-features.csv")

Reduce dataset based on clustering

# transpose the full dataset back to wide so that it is more similar to the notame dataset
imp_meta_omics_wide <- imp_meta_omics %>%
  dplyr::select(-"row_id") %>%
  pivot_wider(names_from = mz_rt,
              values_from = peak_height)

# list of reduced features
clusternames <- cluster_features$mz_rt

# select only the features are in the reduced list
imp_clust <- imp_meta_omics_wide[,c(names(imp_meta_omics_wide) %in% clusternames)]

# bind back sample names
imp_clust <- cbind(imp_meta_omics_wide[1], imp_clust)

tibble(imp_clust)
## # A tibble: 85 × 955
##    sample      `272.9587_0.485` `288.9363_0.485` `226.9658_0.499` `294.9532_0.5`
##    <chr>                  <dbl>            <dbl>            <dbl>          <dbl>
##  1 x5101_b1_c…           11987.           21535.           28761.         22339.
##  2 x5105_b3_l…           15548.           23409.           32647.         24825.
##  3 x5112_b1_b…           14778.           19901.           31099.         23495.
##  4 x5107_b1_b…           13083.           21959.           31327.         24307.
##  5 x5105_b1_l…           14824.           23221.           35289.         23222.
##  6 x5102_b1_c…           15760.           24398.           30828.         22992.
##  7 x5101_b3_c…           13294.           20615.           33028.         25811.
##  8 x5103_b1_l…           13628.           19189.           26919.         22856.
##  9 x5104_b3_l…           12694.           18564.           30674.         25084.
## 10 x5109_b3_b…           12346.           22480.           31363.         23632.
## # ℹ 75 more rows
## # ℹ 950 more variables: `362.9406_0.501` <dbl>, `520.9099_0.514` <dbl>,
## #   `588.8973_0.514` <dbl>, `452.9225_0.515` <dbl>, `656.8848_0.515` <dbl>,
## #   `724.8722_0.515` <dbl>, `792.8596_0.515` <dbl>, `384.9351_0.516` <dbl>,
## #   `316.9477_0.518` <dbl>, `604.8712_0.518` <dbl>, `248.9604_0.52` <dbl>,
## #   `215.0328_0.588` <dbl>, `217.0297_0.589` <dbl>, `151.0261_0.612` <dbl>,
## #   `335.0471_0.599` <dbl>, `649.1192_0.601` <dbl>, `167.021_0.602` <dbl>, …

New mz vs rt plot

Let’s see how our clustered data looks now compared to the original

# plot new rt vs mz scatterplot post-clustering
(plot_mzvsrt_postcluster <- cluster_features %>%
  ggplot(aes(x = rt,
             y = mz)) +
  geom_point() +
  theme_minimal() +
  labs(x = "Retention time, min",
       y = "m/z, neutral",
       title = "mz across RT for all features after clustering"))

# plot both scatterplots to compare with and without notame clustering
(scatterplots <- ggarrange(plot_mzvsrt, 
                           plot_mzvsrt_postcluster, 
                           nrow = 2))

Wrangle new data

# add subject column back for a seamless join with metadata
imp_clust$subject <- imp_meta_omics_wide$subject

# bind back new clustered data with metadata
imp_metabind_clust <- right_join(metadata, 
                                 imp_clust,
                                 by = "subject")

Visualize untransformed data

More wrangling

# meta data columns 
str_meta <- colnames(imp_metabind_clust[,4:13])

# change meta data columns to character so that I can change NAs from QCs to "QC"
imp_metabind_clust <- imp_metabind_clust %>%
  mutate_at(str_meta, as.character) 

# replace NAs in metadata columns for QCs
imp_metabind_clust[is.na(imp_metabind_clust)] <- "QC"

# long df
imp_metabind_clust_tidy <- imp_metabind_clust %>%
  pivot_longer(cols = 15:ncol(.),
               names_to = "mz_rt",
               values_to = "rel_abund")

# structure check
head(imp_metabind_clust_tidy)
## # A tibble: 6 × 16
##   subject treatment tomato_or_control sex   bmi   age   tot_chol ldl_chol
##   <chr>   <chr>     <chr>             <chr> <chr> <chr> <chr>    <chr>   
## 1 5107    beta      tomato            M     23.81 68    177      85.4    
## 2 5107    beta      tomato            M     23.81 68    177      85.4    
## 3 5107    beta      tomato            M     23.81 68    177      85.4    
## 4 5107    beta      tomato            M     23.81 68    177      85.4    
## 5 5107    beta      tomato            M     23.81 68    177      85.4    
## 6 5107    beta      tomato            M     23.81 68    177      85.4    
## # ℹ 8 more variables: hdl_chol <chr>, triglycerides <chr>, glucose <chr>,
## #   SBP <chr>, DBP <chr>, sample <chr>, mz_rt <chr>, rel_abund <dbl>

Boxplot

imp_metabind_clust_tidy %>%
  ggplot(aes(x = subject, y = rel_abund, color = treatment)) +
  geom_boxplot(alpha = 0.6) +
  scale_color_manual(values = c("orange", "lightgreen", "gray", "tomato1")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(title = "LC-MS (+) Feature Abundances by Sample",
       subtitle = "Unscaled data",
       y = "Relative abundance")

Will need to log transform in order to normalize and actually see the data

Log2 transform

imp_metabind_clust_tidy_log2 <- imp_metabind_clust_tidy %>%
  mutate(rel_abund_log2 = log2(rel_abund))

Boxplot

(bp_data_quality <- imp_metabind_clust_tidy_log2 %>%
  ggplot(aes(x = sample, y = rel_abund_log2, color = treatment)) +
  geom_boxplot(alpha = 0.6) +
  scale_color_manual(values = c("orange", "lightgreen", "gray", "tomato1")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90)) +
  labs(title = "LC-MS (+) Feature Abundances by Sample",
       subtitle = "Log2 transformed data",
       y = "Relative abundance"))

Notame drift correction

Data wrangling

Feature abund df

# filtered and imputed data after notame clustering, transposed
features_forQCcorr <- imp_clust %>%
  dplyr::select(!subject) %>%
  t() %>%
  as.data.frame() %>%
  row_to_names(row_number = "find_header")

# log2 transform
log2_features_forQCcorr <- features_forQCcorr %>%
  mutate_all(as.numeric) %>%
  log2()

# write csv to manually edit
write.csv(log2_features_forQCcorr,
          "Notame/feaures_fromR_forDC_1.csv",
          row.names = TRUE)

Import corrected df (edited so that “mz_rt” could be the row name for row 1)

log2_features_forQCcorr_new <- read.csv("Notame/feaures_forR_forDC_editedmzrt_2.csv",
                                header = FALSE,
                                row.names = 1)


log2_features_forQCcorr_new <- log2_features_forQCcorr_new %>%
  rownames_to_column(var = "mz_rt") %>%
  row_to_names(row_number = 1) %>%
  separate(col = mz_rt,
           into = c("mz", "rt"),
           sep = "_")

write.csv(log2_features_forQCcorr_new,
          "Notame/features_fromR_forDC_3.csv",
          row.names = TRUE)

Pheno df

# separate sampleID and injection order
pheno_data <- imp_clust[1] %>%
  separate(col = sample,
           into = c("sample", "injection_order"),
           # last underscore
           sep = "_(?!.*_)")



# make inj order column numeric
pheno_data <- pheno_data %>%
  mutate_at("injection_order", as.numeric)

t_pheno_data <- as.data.frame(t(pheno_data))

write.csv(t_pheno_data,
          "Notame/pheno_df.csv",
          row.names = TRUE)

Combine pheno and feature dfs manually in excel to create metaboset df.

Import Metaboset

#make sure when converting csv to xlsx that you save as a new file, don't just change the name of the file
metaboset <- read_from_excel("Notame/metaboset.xlsx",
                             split_by = c("column", "Ion mode"))
## INFO [2025-09-30 18:38:00] Detecting corner position
## INFO [2025-09-30 18:38:00] Corner detected correctly at row 3, column D
## INFO [2025-09-30 18:38:00] 
## Extracting sample information from rows 1 to 3 and columns E to CK
## INFO [2025-09-30 18:38:00] Replacing spaces in sample information column names with underscores (_)
## INFO [2025-09-30 18:38:00] Naming the last column of sample information "Datafile"
## INFO [2025-09-30 18:38:00] 
## Extracting feature information from rows 4 to 957 and columns A to D
## INFO [2025-09-30 18:38:00] Creating Split column from column, Ion mode
## INFO [2025-09-30 18:38:00] Feature_ID column not found, creating feature IDs
## INFO [2025-09-30 18:38:00] Identified m/z column mass and retention time column rt
## INFO [2025-09-30 18:38:00] Identified m/z column mass and retention time column rt
## INFO [2025-09-30 18:38:00] Creating feature IDs from Split, m/z and retention time
## INFO [2025-09-30 18:38:01] Replacing dots (.) in feature information column names with underscores (_)
## INFO [2025-09-30 18:38:01] 
## Extracting feature abundances from rows 4 to 957 and columns E to CK
## INFO [2025-09-30 18:38:01] 
## Checking sample information
## INFO [2025-09-30 18:38:01] QC column generated from rows containing 'QC'
## INFO [2025-09-30 18:38:01] Sample ID autogenerated from injection orders and prefix ID_
## INFO [2025-09-30 18:38:01] Checking that feature abundances only contain numeric values
## INFO [2025-09-30 18:38:01] 
## Checking feature information
## INFO [2025-09-30 18:38:01] Checking that feature IDs are unique and not stored as numbers
## INFO [2025-09-30 18:38:01] Checking that m/z and retention time values are reasonable
## INFO [2025-09-30 18:38:01] Identified m/z column mass and retention time column rt
## INFO [2025-09-30 18:38:01] Identified m/z column mass and retention time column rt
#construct Metaboset
modes <- construct_metabosets(exprs = metaboset$exprs,
                              pheno_data = metaboset$pheno_data,
                              feature_data = metaboset$feature_data, group_col = "Class")
## Initializing the object(s) with unflagged features
## INFO [2025-09-30 18:38:01] 
## Checking feature information
## INFO [2025-09-30 18:38:01] Checking that feature IDs are unique and not stored as numbers
## INFO [2025-09-30 18:38:01] Checking that feature abundances only contain numeric values
## INFO [2025-09-30 18:38:01] Setting row and column names of exprs based on feature and pheno data
#extract each mode into a single object
mode <- modes$C18_neg

Boxplots before correction

# ordered by injection
(qualityBPs_b4correction <- plot_sample_boxplots(mode, order_by = c("Class", "Injection_order"), title = "Uncorrected feature abundance"))

#ordered by class
plot_sample_boxplots(mode, order_by = "Injection_order", title = "Uncorrected feature abundance")

Boxplots after QC drift correction

drift correction takes up to 2 minutes

mode <- flag_detection(mode, qc_limit = 0.75, group_limit = 0.8)
## INFO [2025-09-30 18:38:05] 
## 0% of features flagged for low detection rate
corrected <- correct_drift(mode, log_transform = FALSE)
## INFO [2025-09-30 18:38:05] 
## Starting drift correction at 2025-09-30 18:38:05.815966
## INFO [2025-09-30 18:38:09] Drift correction performed at 2025-09-30 18:38:09.396701
## INFO [2025-09-30 18:38:11] Inspecting drift correction results 2025-09-30 18:38:11.026608
## INFO [2025-09-30 18:38:15] Drift correction results inspected at 2025-09-30 18:38:15.678307
## INFO [2025-09-30 18:38:15] 
## Drift correction results inspected, report:
## Drift_corrected: 100%

Did drift correction work?

output is percent of the features that were drift corrected. The remaining “low-quality” percent represents features for which the DC did not improve the RSD and D-ratio of the original data.

inspected <- inspect_dc(orig = mode, dc = corrected, check_quality = TRUE)
## INFO [2025-09-30 18:38:20] Inspecting drift correction results 2025-09-30 18:38:20.057847
## INFO [2025-09-30 18:38:26] Drift correction results inspected at 2025-09-30 18:38:26.226664
## INFO [2025-09-30 18:38:26] 
## Drift correction results inspected, report:
## Drift_corrected: 59%,  Low_quality: 41%

Boxplots, corrected

(qualityBPS_driftcorrection <- plot_sample_boxplots(corrected, order_by = c("Class", "Injection_order"), title = "Corrected feature abundance"))

plot_sample_boxplots(corrected, order_by = "Injection_order", title = "Corrected feature abundance")

Compare quality BPs

(qualityBPs_compared <- ggarrange(qualityBPs_b4correction, qualityBPS_driftcorrection,
                    ncol = 1, nrow = 2))

Export new Metaboset to Excel spreadsheet

write_to_excel(corrected, "Notame/metaboset_corrected.xlsx")

Manually edit the df so it only has mass, rt, and sample columns

Import edited Metaboset

metabdata_corrected <- read.csv(file = "Notame/metaboset_corrected_editedforR.csv",
                                check.names = FALSE)

Wrangle new metab data

Combine mz & rt back together

metabdata_corrected_MZ_RT <- metabdata_corrected %>%
  mutate(mass = round(metabdata_corrected$mass, digits = 4), # Decrease number of decimals for m/z & rt
         rt = round(metabdata_corrected$rt, digits = 3),
         .before=1,
         .keep="unused") %>%
  unite(mz_rt, c(mass, rt), remove=TRUE) # Combine m/z & rt with _ in between

Transpose new df

metabdata_corrected_t <- as.data.frame(t(metabdata_corrected_MZ_RT)) %>%
  row_to_names(row_number = "find_header") %>% # make MZ_RT column names
  rownames_to_column(var = "sample") # change rownames to column 1

Bind new data with metadata

I want the new “metabdata_corrected_t” df to look just like “imp_metabind_clust_log2” df

# go back to wide data
imp_metabind_clust_log2 <- imp_metabind_clust_tidy_log2 %>%
  dplyr::select(!rel_abund) %>%
  pivot_wider(names_from = mz_rt,
              values_from = rel_abund_log2)
# bind metadata columns to the new drift corrected df
DC_imp_metabind_clust_log2 <- full_join(imp_metabind_clust_log2[,c(1:14)], 
                                        metabdata_corrected_t, 
                                        by = "sample")

# fix QC subject names
DC_imp_metabind_clust_log2$subject <- str_replace_all(DC_imp_metabind_clust_log2$subject, "c", "qc")

DC_imp_metabind_clust_log2 <- DC_imp_metabind_clust_log2 %>%
  mutate_at("subject", str_sub, start=1, end=4)


# make feature abundances numeric
DC_imp_metabind_clust_log2 <- DC_imp_metabind_clust_log2 %>%
  mutate_at(15:ncol(.), as.numeric)

PCAs

With QCS

Wrangle

PCA.DC_imp_metabind_clust_log2 <- PCA(DC_imp_metabind_clust_log2,  # wide data
                                   quali.sup = 1:14, # remove qualitative variables
                                   graph = FALSE, # don't graph
                                   scale.unit = FALSE) # don't scale, already transformed data

# PCA summary
kable(summary(PCA.DC_imp_metabind_clust_log2))
## 
## Call:
## PCA(X = DC_imp_metabind_clust_log2, scale.unit = FALSE, quali.sup = 1:14,  
##      graph = FALSE) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
## Variance              19.842  16.531  13.524  12.302  11.065   8.404   7.496
## % of var.             11.452   9.541   7.805   7.100   6.386   4.850   4.326
## Cumulative % of var.  11.452  20.993  28.798  35.898  42.284  47.134  51.460
##                        Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13  Dim.14
## Variance               6.892   6.245   5.624   4.849   4.459   3.990   3.607
## % of var.              3.978   3.604   3.246   2.799   2.573   2.303   2.082
## Cumulative % of var.  55.438  59.042  62.288  65.087  67.660  69.963  72.045
##                       Dim.15  Dim.16  Dim.17  Dim.18  Dim.19  Dim.20  Dim.21
## Variance               3.115   3.029   2.830   2.559   2.397   2.150   2.001
## % of var.              1.798   1.748   1.633   1.477   1.384   1.241   1.155
## Cumulative % of var.  73.842  75.590  77.224  78.701  80.084  81.325  82.480
##                       Dim.22  Dim.23  Dim.24  Dim.25  Dim.26  Dim.27  Dim.28
## Variance               1.931   1.852   1.567   1.413   1.359   1.247   1.189
## % of var.              1.114   1.069   0.905   0.816   0.784   0.720   0.686
## Cumulative % of var.  83.594  84.663  85.568  86.383  87.167  87.887  88.574
##                       Dim.29  Dim.30  Dim.31  Dim.32  Dim.33  Dim.34  Dim.35
## Variance               1.135   1.103   0.953   0.946   0.853   0.824   0.790
## % of var.              0.655   0.636   0.550   0.546   0.492   0.476   0.456
## Cumulative % of var.  89.229  89.865  90.416  90.962  91.454  91.930  92.385
##                       Dim.36  Dim.37  Dim.38  Dim.39  Dim.40  Dim.41  Dim.42
## Variance               0.727   0.723   0.637   0.618   0.575   0.541   0.499
## % of var.              0.420   0.417   0.368   0.357   0.332   0.312   0.288
## Cumulative % of var.  92.805  93.222  93.590  93.947  94.278  94.590  94.878
##                       Dim.43  Dim.44  Dim.45  Dim.46  Dim.47  Dim.48  Dim.49
## Variance               0.476   0.446   0.428   0.423   0.389   0.382   0.342
## % of var.              0.275   0.258   0.247   0.244   0.225   0.220   0.197
## Cumulative % of var.  95.153  95.411  95.658  95.902  96.127  96.347  96.545
##                       Dim.50  Dim.51  Dim.52  Dim.53  Dim.54  Dim.55  Dim.56
## Variance               0.336   0.322   0.309   0.294   0.277   0.272   0.263
## % of var.              0.194   0.186   0.179   0.170   0.160   0.157   0.152
## Cumulative % of var.  96.739  96.925  97.103  97.273  97.433  97.590  97.742
##                       Dim.57  Dim.58  Dim.59  Dim.60  Dim.61  Dim.62  Dim.63
## Variance               0.249   0.240   0.231   0.219   0.204   0.196   0.192
## % of var.              0.144   0.139   0.133   0.127   0.118   0.113   0.111
## Cumulative % of var.  97.886  98.024  98.157  98.284  98.402  98.515  98.625
##                       Dim.64  Dim.65  Dim.66  Dim.67  Dim.68  Dim.69  Dim.70
## Variance               0.185   0.170   0.162   0.157   0.148   0.147   0.140
## % of var.              0.107   0.098   0.093   0.090   0.085   0.085   0.081
## Cumulative % of var.  98.732  98.830  98.924  99.014  99.099  99.184  99.265
##                       Dim.71  Dim.72  Dim.73  Dim.74  Dim.75  Dim.76  Dim.77
## Variance               0.137   0.126   0.125   0.119   0.109   0.106   0.100
## % of var.              0.079   0.072   0.072   0.069   0.063   0.061   0.057
## Cumulative % of var.  99.344  99.417  99.489  99.558  99.621  99.682  99.739
##                       Dim.78  Dim.79  Dim.80  Dim.81  Dim.82  Dim.83  Dim.84
## Variance               0.092   0.088   0.082   0.080   0.074   0.036   0.000
## % of var.              0.053   0.051   0.047   0.046   0.043   0.021   0.000
## Cumulative % of var.  99.792  99.843  99.890  99.936  99.979 100.000 100.000
## 
## Individuals (the 10 first)
##                       Dist     Dim.1     ctr    cos2     Dim.2     ctr    cos2
## 1                |  20.533 |  -1.184   0.083   0.003 |  -2.038   0.296   0.010
## 2                |  16.185 |   3.466   0.712   0.046 |   3.498   0.871   0.047
## 3                |  14.348 |  -5.882   2.051   0.168 |   0.788   0.044   0.003
## 4                |  18.070 | -12.004   8.544   0.441 |  -4.188   1.248   0.054
## 5                |  13.723 |  -5.894   2.059   0.184 |   3.357   0.802   0.060
## 6                |  12.703 |  -1.170   0.081   0.008 |   5.334   2.025   0.176
## 7                |  13.491 |  -4.288   1.090   0.101 |  -5.111   1.859   0.144
## 8                |  21.865 | -12.565   9.361   0.330 | -11.661   9.678   0.284
## 9                |  16.181 |  -1.640   0.159   0.010 |   6.056   2.610   0.140
## 10               |  15.124 |   0.660   0.026   0.002 |   8.082   4.648   0.286
##                      Dim.3     ctr    cos2  
## 1                | -11.016  10.557   0.288 |
## 2                |  -4.630   1.865   0.082 |
## 3                |  -1.115   0.108   0.006 |
## 4                |  -3.346   0.974   0.034 |
## 5                |  -2.145   0.400   0.024 |
## 6                |  -1.038   0.094   0.007 |
## 7                |   3.687   1.183   0.075 |
## 8                |   3.611   1.135   0.027 |
## 9                |  -5.668   2.795   0.123 |
## 10               |  -0.871   0.066   0.003 |
## 
## Variables (the 10 first)
##                     Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
## 272.9587_0.485   | -0.003  0.000  0.000 | -0.025  0.004  0.020 |  0.011  0.001
## 288.9363_0.485   |  0.017  0.001  0.013 | -0.035  0.007  0.055 |  0.023  0.004
## 226.9658_0.499   |  0.015  0.001  0.021 | -0.010  0.001  0.010 |  0.001  0.000
## 294.9532_0.5     |  0.016  0.001  0.019 |  0.006  0.000  0.003 |  0.006  0.000
## 362.9406_0.501   |  0.015  0.001  0.027 | -0.005  0.000  0.004 | -0.001  0.000
## 520.9099_0.514   |  0.003  0.000  0.002 |  0.018  0.002  0.059 | -0.016  0.002
## 588.8973_0.514   | -0.005  0.000  0.005 |  0.025  0.004  0.110 | -0.009  0.001
## 452.9225_0.515   | -0.001  0.000  0.000 |  0.015  0.001  0.064 | -0.011  0.001
## 656.8848_0.515   |  0.012  0.001  0.014 |  0.029  0.005  0.082 | -0.022  0.004
## 724.8722_0.515   | -0.003  0.000  0.001 |  0.026  0.004  0.069 | -0.016  0.002
##                    cos2  
## 272.9587_0.485    0.004 |
## 288.9363_0.485    0.024 |
## 226.9658_0.499    0.000 |
## 294.9532_0.5      0.003 |
## 362.9406_0.501    0.000 |
## 520.9099_0.514    0.044 |
## 588.8973_0.514    0.014 |
## 452.9225_0.515    0.036 |
## 656.8848_0.515    0.048 |
## 724.8722_0.515    0.028 |
## 
## Supplementary categories (the 10 first)
##                      Dist    Dim.1   cos2 v.test    Dim.2   cos2 v.test  
## 5101             | 10.444 | -1.428  0.019 -0.456 |  2.925  0.078  1.024 |
## 5102             | 10.618 | -2.638  0.062 -0.842 | -1.669  0.025 -0.584 |
## 5103             | 12.500 | -5.469  0.191 -1.747 | -2.939  0.055 -1.028 |
## 5104             | 11.850 | -6.483  0.299 -2.071 | -5.359  0.205 -1.875 |
## 5105             | 13.414 | -4.523  0.114 -1.445 | -5.311  0.157 -1.858 |
## 5107             | 16.936 |  1.141  0.005  0.364 |  0.730  0.002  0.255 |
## 5108             | 14.400 | -3.240  0.051 -1.035 | -0.927  0.004 -0.324 |
## 5109             | 14.516 | -8.943  0.380 -2.856 | -1.700  0.014 -0.595 |
## 5110             | 12.013 | -4.309  0.129 -1.376 |  2.852  0.056  0.998 |
## 5111             | 12.776 | -1.482  0.013 -0.473 | -2.394  0.035 -0.838 |
##                   Dim.3   cos2 v.test  
## 5101              0.027  0.000  0.010 |
## 5102              4.581  0.186  1.772 |
## 5103              0.366  0.001  0.142 |
## 5104              1.728  0.021  0.669 |
## 5105             -0.270  0.000 -0.104 |
## 5107             -7.823  0.213 -3.026 |
## 5108             -6.267  0.189 -2.425 |
## 5109             -2.230  0.024 -0.863 |
## 5110             -3.463  0.083 -1.340 |
## 5111              7.980  0.390  3.087 |
Dist Dim.1 cos2 v.test Dim.2 cos2 v.test Dim.3 cos2 v.test
5101 | 10.444 | -1.428 0.019 -0.456 | 2.925 0.078 1.024 | 0.027 0.000 0.010 |
5102 | 10.618 | -2.638 0.062 -0.842 | -1.669 0.025 -0.584 | 4.581 0.186 1.772 |
5103 | 12.500 | -5.469 0.191 -1.747 | -2.939 0.055 -1.028 | 0.366 0.001 0.142 |
5104 | 11.850 | -6.483 0.299 -2.071 | -5.359 0.205 -1.875 | 1.728 0.021 0.669 |
5105 | 13.414 | -4.523 0.114 -1.445 | -5.311 0.157 -1.858 | -0.270 0.000 -0.104 |
5107 | 16.936 | 1.141 0.005 0.364 | 0.730 0.002 0.255 | -7.823 0.213 -3.026 |
5108 | 14.400 | -3.240 0.051 -1.035 | -0.927 0.004 -0.324 | -6.267 0.189 -2.425 |
5109 | 14.516 | -8.943 0.380 -2.856 | -1.700 0.014 -0.595 | -2.230 0.024 -0.863 |
5110 | 12.013 | -4.309 0.129 -1.376 | 2.852 0.056 0.998 | -3.463 0.083 -1.340 |
5111 | 12.776 | -1.482 0.013 -0.473 | -2.394 0.035 -0.838 | 7.980 0.390 3.087 |
# pull PC coordinates into df
PC_coord_QC_log2 <- as.data.frame(PCA.DC_imp_metabind_clust_log2$ind$coord)

# bind back metadata from cols 1-14
PC_coord_QC_log2 <- bind_cols(DC_imp_metabind_clust_log2[,1:14], PC_coord_QC_log2)

# grab some variance explained
importance_QC <- PCA.DC_imp_metabind_clust_log2$eig

# set variance explained with PC1, round to 2 digits
PC1_withQC <- round(importance_QC[1,2], 2)

# set variance explained with PC2, round to 2 digits
PC2_withQC <- round(importance_QC[2,2], 2)

Plots

Using FactoExtra package

# scree plot
fviz_eig(PCA.DC_imp_metabind_clust_log2)

# get eigenvalues
kable(get_eig(PCA.DC_imp_metabind_clust_log2))
eigenvalue variance.percent cumulative.variance.percent
Dim.1 19.8421755 11.4518536 11.45185
Dim.2 16.5307904 9.5406974 20.99255
Dim.3 13.5237358 7.8051846 28.79774
Dim.4 12.3020654 7.1001011 35.89784
Dim.5 11.0647299 6.3859765 42.28381
Dim.6 8.4040513 4.8503736 47.13419
Dim.7 7.4956565 4.3260962 51.46028
Dim.8 6.8924751 3.9779718 55.43825
Dim.9 6.2447866 3.6041603 59.04242
Dim.10 5.6237895 3.2457537 62.28817
Dim.11 4.8493397 2.7987822 65.08695
Dim.12 4.4587015 2.5733265 67.66028
Dim.13 3.9898243 2.3027154 69.96299
Dim.14 3.6072051 2.0818879 72.04488
Dim.15 3.1145811 1.7975714 73.84245
Dim.16 3.0286837 1.7479960 75.59045
Dim.17 2.8301684 1.6334234 77.22387
Dim.18 2.5587894 1.4767978 78.70067
Dim.19 2.3971540 1.3835104 80.08418
Dim.20 2.1496833 1.2406834 81.32486
Dim.21 2.0008810 1.1548026 82.47967
Dim.22 1.9309956 1.1144685 83.59413
Dim.23 1.8520226 1.0688894 84.66302
Dim.24 1.5674275 0.9046362 85.56766
Dim.25 1.4130659 0.8155469 86.38321
Dim.26 1.3585949 0.7841091 87.16732
Dim.27 1.2472250 0.7198322 87.88715
Dim.28 1.1894317 0.6864770 88.57363
Dim.29 1.1353607 0.6552701 89.22890
Dim.30 1.1028196 0.6364891 89.86538
Dim.31 0.9532155 0.5501455 90.41553
Dim.32 0.9463791 0.5461999 90.96173
Dim.33 0.8528924 0.4922444 91.45397
Dim.34 0.8239744 0.4755544 91.92953
Dim.35 0.7900000 0.4559462 92.38547
Dim.36 0.7269618 0.4195639 92.80504
Dim.37 0.7230376 0.4172990 93.22234
Dim.38 0.6367755 0.3675131 93.58985
Dim.39 0.6181784 0.3567799 93.94663
Dim.40 0.5747396 0.3317093 94.27834
Dim.41 0.5406162 0.3120151 94.59036
Dim.42 0.4989367 0.2879599 94.87832
Dim.43 0.4764383 0.2749750 95.15329
Dim.44 0.4463250 0.2575952 95.41089
Dim.45 0.4281641 0.2471136 95.65800
Dim.46 0.4232934 0.2443026 95.90230
Dim.47 0.3890995 0.2245677 96.12687
Dim.48 0.3818560 0.2203871 96.34726
Dim.49 0.3420712 0.1974254 96.54468
Dim.50 0.3359414 0.1938876 96.73857
Dim.51 0.3224576 0.1861055 96.92467
Dim.52 0.3094896 0.1786210 97.10330
Dim.53 0.2938807 0.1696124 97.27291
Dim.54 0.2771909 0.1599799 97.43289
Dim.55 0.2718670 0.1569073 97.58980
Dim.56 0.2630650 0.1518272 97.74162
Dim.57 0.2493399 0.1439058 97.88553
Dim.58 0.2401879 0.1386238 98.02415
Dim.59 0.2310412 0.1333448 98.15750
Dim.60 0.2193334 0.1265876 98.28408
Dim.61 0.2038445 0.1176482 98.40173
Dim.62 0.1959995 0.1131205 98.51485
Dim.63 0.1915519 0.1105536 98.62541
Dim.64 0.1851354 0.1068503 98.73226
Dim.65 0.1699516 0.0980870 98.83034
Dim.66 0.1619971 0.0934962 98.92384
Dim.67 0.1565721 0.0903652 99.01421
Dim.68 0.1475668 0.0851678 99.09937
Dim.69 0.1468370 0.0847466 99.18412
Dim.70 0.1401048 0.0808611 99.26498
Dim.71 0.1372662 0.0792228 99.34420
Dim.72 0.1255668 0.0724705 99.41667
Dim.73 0.1251464 0.0722279 99.48890
Dim.74 0.1192392 0.0688186 99.55772
Dim.75 0.1089387 0.0628736 99.62059
Dim.76 0.1062115 0.0612997 99.68189
Dim.77 0.0996014 0.0574847 99.73938
Dim.78 0.0917010 0.0529249 99.79230
Dim.79 0.0875116 0.0505071 99.84281
Dim.80 0.0820157 0.0473351 99.89015
Dim.81 0.0798054 0.0460594 99.93620
Dim.82 0.0742665 0.0428627 99.97907
Dim.83 0.0362668 0.0209313 100.00000
Dim.84 0.0000019 0.0000011 100.00000
# scores plot
fviz_pca_ind(PCA.DC_imp_metabind_clust_log2)

Manual scores plot

# manual scores plot
(PCA_withQCs <- PC_coord_QC_log2 %>%
  ggplot(aes(x = Dim.1, y = Dim.2,
             fill = factor(treatment, levels = c("control", "beta", "red", "QC")),
             text = sample)) +
  geom_point(shape = 21, alpha = 0.8) +
  scale_fill_manual(values = c("lightgreen", "orange", "tomato", "lightgray")) +
  scale_color_manual(values = "black") +  
  theme_minimal() +
  coord_fixed(PC2_withQC/PC1_withQC) +
  labs(x = glue::glue("PC1: {PC1_withQC}%"),
       y = glue::glue("PC2: {PC2_withQC}%"),
       fill = "Group",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data"))

ggplotly(PCA_withQCs, tooltip = "text")

Without QCs

Wrangle

DC_imp_metabind_clust_log2_noQCs <- DC_imp_metabind_clust_log2 %>%
  filter(treatment != "QC")

PCA.DC_imp_metabind_clust_log2_noQCs <- PCA(DC_imp_metabind_clust_log2_noQCs, # wide data
                               quali.sup=1:14, # remove qualitative variables
                               graph=FALSE, # don't graph
                               scale.unit=FALSE) # don't scale, we already did this

# look at summary
kable(summary(PCA.DC_imp_metabind_clust_log2_noQCs))
## 
## Call:
## PCA(X = DC_imp_metabind_clust_log2_noQCs, scale.unit = FALSE,  
##      quali.sup = 1:14, graph = FALSE) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
## Variance              21.617  16.532  14.989  13.437  10.636   9.166   8.369
## % of var.             11.456   8.761   7.943   7.121   5.637   4.858   4.435
## Cumulative % of var.  11.456  20.217  28.161  35.281  40.918  45.776  50.211
##                        Dim.8   Dim.9  Dim.10  Dim.11  Dim.12  Dim.13  Dim.14
## Variance               7.644   7.304   6.151   5.734   5.193   4.398   3.791
## % of var.              4.051   3.871   3.260   3.039   2.752   2.331   2.009
## Cumulative % of var.  54.261  58.132  61.392  64.431  67.183  69.514  71.523
##                       Dim.15  Dim.16  Dim.17  Dim.18  Dim.19  Dim.20  Dim.21
## Variance               3.678   3.434   3.205   3.053   2.653   2.420   2.342
## % of var.              1.949   1.820   1.698   1.618   1.406   1.282   1.241
## Cumulative % of var.  73.472  75.292  76.991  78.609  80.015  81.297  82.539
##                       Dim.22  Dim.23  Dim.24  Dim.25  Dim.26  Dim.27  Dim.28
## Variance               2.245   1.951   1.734   1.649   1.511   1.447   1.378
## % of var.              1.190   1.034   0.919   0.874   0.801   0.767   0.730
## Cumulative % of var.  83.729  84.762  85.681  86.555  87.356  88.122  88.852
##                       Dim.29  Dim.30  Dim.31  Dim.32  Dim.33  Dim.34  Dim.35
## Variance               1.331   1.158   1.147   1.031   0.999   0.960   0.888
## % of var.              0.705   0.614   0.608   0.546   0.530   0.509   0.471
## Cumulative % of var.  89.558  90.172  90.780  91.326  91.855  92.364  92.835
##                       Dim.36  Dim.37  Dim.38  Dim.39  Dim.40  Dim.41  Dim.42
## Variance               0.880   0.778   0.743   0.695   0.665   0.601   0.584
## % of var.              0.466   0.412   0.394   0.368   0.352   0.318   0.310
## Cumulative % of var.  93.301  93.713  94.107  94.475  94.827  95.146  95.455
##                       Dim.43  Dim.44  Dim.45  Dim.46  Dim.47  Dim.48  Dim.49
## Variance               0.536   0.521   0.517   0.473   0.458   0.430   0.401
## % of var.              0.284   0.276   0.274   0.251   0.242   0.228   0.212
## Cumulative % of var.  95.739  96.015  96.289  96.540  96.782  97.010  97.222
##                       Dim.50  Dim.51  Dim.52  Dim.53  Dim.54  Dim.55  Dim.56
## Variance               0.378   0.376   0.349   0.343   0.329   0.323   0.314
## % of var.              0.200   0.199   0.185   0.182   0.174   0.171   0.167
## Cumulative % of var.  97.422  97.622  97.807  97.989  98.163  98.334  98.501
##                       Dim.57  Dim.58  Dim.59  Dim.60  Dim.61  Dim.62  Dim.63
## Variance               0.294   0.278   0.261   0.241   0.232   0.230   0.219
## % of var.              0.156   0.148   0.138   0.128   0.123   0.122   0.116
## Cumulative % of var.  98.656  98.804  98.942  99.070  99.193  99.315  99.431
##                       Dim.64  Dim.65  Dim.66  Dim.67  Dim.68  Dim.69
## Variance               0.199   0.189   0.185   0.173   0.168   0.160
## % of var.              0.106   0.100   0.098   0.092   0.089   0.085
## Cumulative % of var.  99.537  99.637  99.735  99.827  99.915 100.000
## 
## Individuals (the 10 first)
##                       Dist     Dim.1     ctr    cos2     Dim.2     ctr    cos2
## 1                |  20.626 |  -2.350   0.365   0.013 | -10.222   9.030   0.246
## 2                |  16.336 |   5.053   1.687   0.096 |  -4.493   1.744   0.076
## 3                |  13.939 |  -3.381   0.756   0.059 |  -1.995   0.344   0.020
## 4                |  17.543 | -11.161   8.232   0.405 |  -3.795   1.245   0.047
## 5                |  13.107 |  -1.471   0.143   0.013 |  -3.236   0.905   0.061
## 6                |  12.476 |   3.078   0.626   0.061 |  -2.187   0.413   0.031
## 7                |  13.498 |  -6.406   2.712   0.225 |   3.774   1.231   0.078
## 8                |  21.675 | -16.885  18.840   0.607 |   3.827   1.266   0.031
## 9                |  15.910 |   3.208   0.680   0.041 |  -6.731   3.915   0.179
## 10               |  14.902 |   6.384   2.693   0.184 |  -2.210   0.422   0.022
##                      Dim.3     ctr    cos2  
## 1                |   4.094   1.598   0.039 |
## 2                |   0.460   0.020   0.001 |
## 3                |  -4.606   2.022   0.109 |
## 4                |   2.888   0.795   0.027 |
## 5                |   1.140   0.124   0.008 |
## 6                |  -4.520   1.948   0.131 |
## 7                |  -8.348   6.642   0.383 |
## 8                |  -6.209   3.674   0.082 |
## 9                |  -1.775   0.300   0.012 |
## 10               |  -3.963   1.497   0.071 |
## 
## Variables (the 10 first)
##                     Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
## 272.9587_0.485   | -0.023  0.002  0.016 |  0.015  0.001  0.007 | -0.026  0.005
## 288.9363_0.485   | -0.015  0.001  0.009 |  0.034  0.007  0.047 |  0.047  0.014
## 226.9658_0.499   |  0.003  0.000  0.001 |  0.005  0.000  0.002 |  0.000  0.000
## 294.9532_0.5     |  0.018  0.001  0.023 |  0.009  0.000  0.005 |  0.019  0.002
## 362.9406_0.501   |  0.005  0.000  0.003 |  0.000  0.000  0.000 | -0.014  0.001
## 520.9099_0.514   |  0.017  0.001  0.045 | -0.019  0.002  0.060 |  0.009  0.001
## 588.8973_0.514   |  0.016  0.001  0.041 | -0.015  0.001  0.034 | -0.018  0.002
## 452.9225_0.515   |  0.012  0.001  0.036 | -0.015  0.001  0.056 |  0.005  0.000
## 656.8848_0.515   |  0.030  0.004  0.076 | -0.029  0.005  0.070 | -0.008  0.000
## 724.8722_0.515   |  0.019  0.002  0.035 | -0.023  0.003  0.053 | -0.024  0.004
##                    cos2  
## 272.9587_0.485    0.021 |
## 288.9363_0.485    0.087 |
## 226.9658_0.499    0.000 |
## 294.9532_0.5      0.027 |
## 362.9406_0.501    0.022 |
## 520.9099_0.514    0.013 |
## 588.8973_0.514    0.047 |
## 452.9225_0.515    0.006 |
## 656.8848_0.515    0.005 |
## 724.8722_0.515    0.054 |
## 
## Supplementary categories (the 10 first)
##                      Dist    Dim.1   cos2 v.test    Dim.2   cos2 v.test  
## 5101             | 10.150 |  1.395  0.019  0.427 | -0.524  0.003 -0.183 |
## 5102             | 10.416 | -2.515  0.058 -0.770 |  4.671  0.201  1.637 |
## 5103             | 12.264 | -5.713  0.217 -1.750 |  0.154  0.000  0.054 |
## 5104             | 11.605 | -8.031  0.479 -2.461 |  1.904  0.027  0.667 |
## 5105             | 13.384 | -6.744  0.254 -2.066 |  0.113  0.000  0.040 |
## 5107             | 17.064 |  1.352  0.006  0.414 | -7.358  0.186 -2.578 |
## 5108             | 14.342 | -2.984  0.043 -0.914 | -6.401  0.199 -2.243 |
## 5109             | 13.984 | -7.271  0.270 -2.228 | -2.895  0.043 -1.014 |
## 5110             | 11.507 | -0.782  0.005 -0.240 | -4.276  0.138 -1.498 |
## 5111             | 12.772 | -2.192  0.029 -0.672 |  8.115  0.404  2.843 |
##                   Dim.3   cos2 v.test  
## 5101             -0.963  0.009 -0.354 |
## 5102              1.398  0.018  0.514 |
## 5103             -4.590  0.140 -1.689 |
## 5104             -1.593  0.019 -0.586 |
## 5105             -3.762  0.079 -1.384 |
## 5107              2.277  0.018  0.838 |
## 5108             -4.617  0.104 -1.699 |
## 5109             -0.859  0.004 -0.316 |
## 5110             -1.166  0.010 -0.429 |
## 5111             -2.251  0.031 -0.828 |
Dist Dim.1 cos2 v.test Dim.2 cos2 v.test Dim.3 cos2 v.test
5101 | 10.150 | 1.395 0.019 0.427 | -0.524 0.003 -0.183 | -0.963 0.009 -0.354 |
5102 | 10.416 | -2.515 0.058 -0.770 | 4.671 0.201 1.637 | 1.398 0.018 0.514 |
5103 | 12.264 | -5.713 0.217 -1.750 | 0.154 0.000 0.054 | -4.590 0.140 -1.689 |
5104 | 11.605 | -8.031 0.479 -2.461 | 1.904 0.027 0.667 | -1.593 0.019 -0.586 |
5105 | 13.384 | -6.744 0.254 -2.066 | 0.113 0.000 0.040 | -3.762 0.079 -1.384 |
5107 | 17.064 | 1.352 0.006 0.414 | -7.358 0.186 -2.578 | 2.277 0.018 0.838 |
5108 | 14.342 | -2.984 0.043 -0.914 | -6.401 0.199 -2.243 | -4.617 0.104 -1.699 |
5109 | 13.984 | -7.271 0.270 -2.228 | -2.895 0.043 -1.014 | -0.859 0.004 -0.316 |
5110 | 11.507 | -0.782 0.005 -0.240 | -4.276 0.138 -1.498 | -1.166 0.010 -0.429 |
5111 | 12.772 | -2.192 0.029 -0.672 | 8.115 0.404 2.843 | -2.251 0.031 -0.828 |
# pull PC coordinates into df
PC_coord_noQCs_log2 <- as.data.frame(PCA.DC_imp_metabind_clust_log2_noQCs$ind$coord)

# bind back metadata from cols 1-14
PC_coord_noQCs_log2 <- bind_cols(DC_imp_metabind_clust_log2_noQCs[,1:14], PC_coord_noQCs_log2)

# grab some variance explained
importance_noQC <- PCA.DC_imp_metabind_clust_log2_noQCs$eig

# set variance explained with PC1, round to 2 digits
PC1_noQC <- round(importance_noQC[1,2], 2)

# set variance explained with PC2, round to 2 digits
PC2_noQC <- round(importance_noQC[2,2], 2)

Plots

Using FactoExtra

# scree plot
fviz_eig(PCA.DC_imp_metabind_clust_log2_noQCs)

# scores plot
fviz_pca_ind(PCA.DC_imp_metabind_clust_log2_noQCs)

Manual scores plot

# wrangling data prior to plot for ease
PC_coord_noQCs_log2 <- PC_coord_noQCs_log2 %>%
  mutate(sample2 = sample) %>%
  mutate_at("sample2", str_sub, start=7, end=8) %>%
  mutate(period = sample2) %>%
  unite(treatment_period, "treatment", "period", sep = "_", remove = FALSE) %>%
  dplyr::select(!sample2) %>%
  mutate_at("period", as.factor) %>%
  # relevel factors
  mutate(treatment_period = fct_relevel(treatment_period, c("control_b1", "control_b3", 
                                                            "beta_b1", "beta_b3",
                                                            "red_b1", "red_b3")),
         treatment = fct_relevel(treatment, c("control", "beta", "red")))
(PCA_withoutQCs <- PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = treatment_period,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan3", "orangered2",
                               "lavenderblush3", "darkred")) +
  scale_color_manual(values = "black") +  
  theme_minimal() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "Group",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data, No QCs"))

ggplotly(PCA_withoutQCs, tooltip = "text")

Faceted by period

(PCA_faceted_noQCs <- PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = treatment_period,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan3", "orangered2",
                               "lavenderblush3", "darkred")) +
  scale_color_manual(values = "black") +  
  theme_bw() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "treatment_period",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data, No QCs") +
  facet_wrap( ~ period) +
   theme(strip.background = element_rect(fill="white")))

ggplotly(PCA_faceted_noQCs, tooltip = "text")
PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = sex,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("purple", "blue")) +
  scale_color_manual(values = "black") +  
  theme_bw() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "sex",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data, No QCs") +
  facet_wrap( ~ period) +
   theme(strip.background = element_rect(fill="white"))

Faceted by trt

trt_labels <- c("control" = "Control",
                "beta" = "High \U03b2-Carotene", 
                "red" = "High Lycopene")

(PCA_faceted_noQCs2 <- PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = treatment_period,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan", "orangered2",
                               "lavenderblush3", "darkred"),
                    labels = c("pre control", "post control",
                               "pre high \U03b2-carotene", "post high \U03b2-carotene",
                               "pre high lycopene", "post high lycopene")) +
  scale_color_manual(values = "black") +  
  theme_bw() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "Intervention timepoint",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed LC-MS lipidomics data (ESI -) faceted by treatment group") +
   facet_wrap( ~ treatment, labeller = as_labeller(trt_labels)))

Export plot

ggsave(plot = PCA_faceted_noQCs2,
       filename = "plots and figures/PCA-faceted-by-group-lipidomicsNEG.svg",
       bg = "transparent",
       height = 4,
       width = 8)
PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = sex,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("purple", "blue")) +
  scale_color_manual(values = "black") +  
  theme_bw() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "sex",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data, No QCs") +
  facet_wrap( ~ treatment) +
   theme(strip.background = element_rect(fill="white"))

Faceted by sex

(PC_coord_facetsex <- PC_coord_noQCs_log2 %>%
   ggplot(aes(x = Dim.1, y = Dim.2,
             fill = treatment_period,
             text = sample)) +
   geom_point(shape = 21, alpha = 0.8) +
   geom_hline(yintercept = 0, linetype = "dashed", alpha=0.5) +
   geom_vline(xintercept = 0, linetype = "dashed", alpha=0.5) +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan3", "orangered2",
                               "lavenderblush3", "darkred")) +
  scale_color_manual(values = "black") +  
  theme_bw() +
  coord_fixed(PC2_noQC/PC1_noQC) +
  labs(x = glue::glue("PC1: {PC1_noQC}%"),
       y = glue::glue("PC2: {PC2_noQC}%"),
       fill = "sex",
       title = "Principal Components Analysis Scores Plot",
       subtitle = "Log2 transformed data, No QCs") +
  facet_wrap( ~ sex) +
   theme(strip.background = element_rect(fill="white")))

ggplotly(PC_coord_facetsex, tooltip = "text")

Multilevel PCA

This type of PCA accounts for the structure of paired data, allowing for a more accurate assessment of biological differences between treatment groups, not differences attributed to the natural variation between individuals.

See http://mixomics.org/methods/multilevel/ for more info.

Wrangle

Data_forMPCA <- DC_imp_metabind_clust_log2_noQCs %>%
  mutate_at("subject", as.factor) %>%
  mutate(sample2 = sample,
         b_c = carotenoids$b_c_nmol_l_plasma,
         lyc = carotenoids$lyc_nmol_l_plasma,
         apo13one = carotenoids$apo13one_nmol_l_plasma,
         retinol = carotenoids$retinol_nmol_l_plasma,
         total_carot = carotenoids$total_carotenoids) %>%
  mutate_at("sample2", str_sub, start=7, end=8) %>%
  mutate(period = sample2) %>%
  dplyr::select(c(1:14), period, b_c, lyc, apo13one, retinol, total_carot, everything()) %>%
  dplyr::select(!sample2)
 

summary(as.factor(Data_forMPCA$subject))
## 5101 5102 5103 5104 5105 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 
##    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2 
## 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 
##    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2    2 
## 5134 5135 5136 
##    2    2    2
# make a vector for meta variables
(metavar <- Data_forMPCA[,c(1:20)] %>%
    colnames())
##  [1] "subject"           "treatment"         "tomato_or_control"
##  [4] "sex"               "bmi"               "age"              
##  [7] "tot_chol"          "ldl_chol"          "hdl_chol"         
## [10] "triglycerides"     "glucose"           "SBP"              
## [13] "DBP"               "sample"            "period"           
## [16] "b_c"               "lyc"               "apo13one"         
## [19] "retinol"           "total_carot"

Regular PCA

mixOmicsPCA.result <- mixOmics::pca(Data_forMPCA[,!names(Data_forMPCA) %in% metavar],
                            scale = FALSE,
                            center = FALSE)

plotIndiv(mixOmicsPCA.result, 
          ind.names = Data_forMPCA$subject, 
          group = Data_forMPCA$treatment, 
          legend = TRUE, 
          legend.title = "Treatment", 
          title = 'Regular PCA, Lipidomics C18 (-)')

Multilevel PCA

With all data

multilevelPCA.result <- mixOmics::pca(Data_forMPCA[,-(c(1:20))], 
                            multilevel = Data_forMPCA$subject,
                            scale = FALSE,
                            center = FALSE,ncomp = 10)

plotIndiv(multilevelPCA.result, 
          ind.names = Data_forMPCA$period, 
          group = Data_forMPCA$treatment, 
          legend = TRUE, 
          legend.title = "Treatment", 
          title = 'Multilevel PCA, Lipidomics C18 (-)',comp = c(1,2))

Loadings

plotLoadings(multilevelPCA.result, ndisplay = 30)

sPLS-DA

Following http://mixomics.org/case-studies/splsda-srbct-case-study/

mat_Data_forMPCA <- Data_forMPCA %>%
  dplyr::select(!metavar) %>%
  as.matrix()
  

class_forMPCA <- Data_forMPCA$treatment %>%
  as.factor()

# checking dimensions of feature abundance matrix
dim(mat_Data_forMPCA)

# checking the distribution of treatment group
summary(class_forMPCA)

Initial model

“A PLS-DA model is fitted with ten components to evaluate the performance and the number of components necessary for the final model.”

splsda <- splsda(mat_Data_forMPCA, class_forMPCA, ncomp = 3)  # set ncomp to 10 for performance assessment later
# plot the samples projected onto the first two components of the PLS-DA subspace
plotIndiv(splsda , comp = 1:2, 
          group = class_forMPCA, ind.names = FALSE,  # colour points by class
          ellipse = TRUE, # include 95% confidence ellipse for each class
          legend = TRUE, title = '(a) PLSDA with confidence ellipses')

# use the max.dist measure to form decision boundaries between classes based on PLS-DA data
background = background.predict(splsda, comp.predicted=2, dist = "max.dist")

# plot the samples projected onto the first two components of the PLS-DA subspace
plotIndiv(splsda, comp = 1:2,
          group = class_forMPCA, ind.names = FALSE, # colour points by class
          background = background, # include prediction background for each class
          legend = TRUE, title = " (b) PLSDA with prediction background")

Model tuning

# undergo performance evaluation in order to tune the number of components to use
perf.splsda <- perf(splsda, validation = "loo", 
                          folds = 5, nrepeat = 100, # use repeated cross-validation
                          progressBar = FALSE, auc = TRUE) # include AUC values

# plot the outcome of performance evaluation across all ten components
plot(perf.splsda, col = color.mixo(5:7), sd = TRUE,
     legend.position = "horizontal")

perf.splsda$choice.ncomp # what is the optimal value of components according to perf()
# grid of possible keepX values that will be tested for each component
list.keepX <- c(1:10,  seq(20, 300, 10))

# undergo the tuning process to determine the optimal number of variables
tune.splsda <- tune.splsda(mat_Data_forMPCA, class_forMPCA, ncomp = 9, # calculate for first 9 components
                                 validation = 'loo',
                                 folds = 5, nrepeat = 100, # use repeated cross-validation
                                 dist = 'max.dist', # use max.dist measure
                                 measure = "BER", # use balanced error rate of dist measure
                                 test.keepX = list.keepX,
                                 cpus = 2) # allow for parallelization to decrease runtime

plot(tune.splsda, col = color.jet(9)) # plot output of variable number tuning

sPCA

result.sPCA.multi <- spca(Data_forMPCA[,!names(Data_forMPCA) %in% metavar],
                          keepX = c(10, 10),
                          multilevel = Data_forMPCA$subject)


plotIndiv(result.sPCA.multi,
          ind.names = Data_forMPCA$period, 
          group = Data_forMPCA$treatment, 
          legend = TRUE, 
          legend.title = "Treatment", 
          title = 'Multilevel sPCA, Lipidomics C18 (-)',comp = c(1,2))

plotVar(result.sPCA.multi)  

selectVar(result.sPCA.multi, comp = 1)$name
##  [1] "855.6591_9.033" "857.6749_9.986" "829.6431_8.816" "925.6617_9.988"
##  [5] "843.6586_9.396" "827.6272_7.905" "923.646_9.035"  "819.6141_8.816"
##  [9] "849.6462_9.988" "909.6368_9.99"
plotLoadings(result.sPCA.multi, method = "mean", contrib = "max")

PCAtools

Data wrangling

# create rel abund df suitable for PCAtools package
imp_clust_omicsdata_forPCAtools <- Data_forMPCA %>%
  # select only sample ID and feature columns
  dplyr::select(sample,
                21:ncol(.)) %>%
  # transpose
  t() %>%
  # convert back to df
  as.data.frame()

names(imp_clust_omicsdata_forPCAtools) <- imp_clust_omicsdata_forPCAtools[1,] # make samp;e IDs column names

imp_clust_omicsdata_forPCAtools <- imp_clust_omicsdata_forPCAtools[-1,] # remove sample ID row

# create metadata df suitable for PCAtools pckg

metadata_forPCAtools <- Data_forMPCA[,1:20]

metadata_forPCAtools <- metadata_forPCAtools %>%
  unite("treatment_period", c("treatment", "period"), sep = "_", remove = FALSE) %>%
  column_to_rownames("sample")
  

# create a vector so that col names in abundance df matches metadata df
order_forPCAtools <- match(colnames(imp_clust_omicsdata_forPCAtools), rownames(metadata_forPCAtools))

# reorder col names in abundance df so that it matches metadata
log2_abundances_reordered_forPCAtools <- imp_clust_omicsdata_forPCAtools[,order_forPCAtools] %>%
  # change abundance df to numeric
  mutate_all(as.numeric)

PCA

colby trt

# pca
p <- PCAtools::pca(log2_abundances_reordered_forPCAtools,
                   metadata = metadata_forPCAtools,
                   scale = FALSE, # using scaled data already (log2 transformed)
         
)

biplot(p, 
       lab = paste0(metadata_forPCAtools$subject),
       colby = 'treatment',
       colkey = c("control" = "lightgreen",
                  "beta" = "orange",
                  "red" = "tomato"),
       hline = 0, vline = 0,
       legendPosition = 'right',
       title = "PCA Scores Plot with Loadings",
       subtitle = "Log2 transformed data. 95% CI ellipses",
       ellipse = TRUE,
       ellipseType = 't', # assumes multivariate
       ellipseLevel = 0.95,
       ellipseFill = TRUE,
       ellipseAlpha = 0.2,
       ellipseLineSize = 0,
       showLoadings = TRUE,ntopLoadings = 10)

colby period

# pca

biplot(p,
       lab = paste0(metadata_forPCAtools$subject),
       colby = 'period',
       colkey = c("b1" = "gray",
                  "b3" = "pink"),
       hline = 0, vline = 0,
       legendPosition = 'right',
       title = "PCA Scores Plot with Loadings",
       subtitle = "Log2 transformed data. 95% CI ellipses",
       ellipse = TRUE,
       ellipseType = 't', # assumes multivariate
       ellipseLevel = 0.95,
       ellipseFill = TRUE,
       ellipseAlpha = 0.2,
       ellipseLineSize = 0,
       showLoadings = TRUE)

colby trt_period

biplot(p,
       lab = paste0(metadata_forPCAtools$subject),
       colby = 'treatment_period',
       colkey = c("control_b1" = "darkseagreen2",
               "control_b3" = "darkgreen",
               "beta_b1" = "tan3",
               "beta_b3" = "orangered2",
               "red_b1" = "lavenderblush3",
               "red_b3" = "darkred"),
       hline = 0, vline = 0,
       legendPosition = 'right',
       title = "PCA Scores Plot with Loadings",
       subtitle = "Log2 transformed data. 95% CI ellipses.",
       ellipse = TRUE,
       ellipseType = 't', # assumes multivariate
       ellipseLevel = 0.95,
       ellipseFill = TRUE,
       ellipseAlpha = 0.2,
       ellipseLineSize = 0,
       showLoadings = TRUE, ntopLoadings = 10)

biplot(p,
       lab = paste0(metadata_forPCAtools$subject),
       colby = 'treatment_period',
       colkey = c("control_b1" = "darkseagreen2",
               "control_b3" = "darkgreen",
               "beta_b1" = "tan3",
               "beta_b3" = "orangered2",
               "red_b1" = "lavenderblush3",
               "red_b3" = "darkred"),
       hline = 0, vline = 0,
       legendPosition = 'right',
       title = "PCA Scores Plot with Loadings",
       subtitle = "Log2 transformed data. 95% CI ellipses.",
       showLoadings = TRUE, ntopLoadings = 10)

Let’s explore a little more

How many PCs do we need to capture at least 80% variance?

which(cumsum(p$variance) > 80)[1]
## PC19 
##   19

This shows we’d need quite a few PCs to capture most of the variance.

Pairs plots

Here, we will look at separations for several components at once using pairs plots.

treatment_period

pairsplot(p,
    components = getComponents(p, c(1:10)),
    triangle = TRUE, trianglelabSize = 12,
    hline = 0, vline = 0,
    pointSize = 0.4,
    gridlines.major = FALSE, gridlines.minor = FALSE,
    colby = 'treatment_period',
    colkey = c("control_b1" = "darkseagreen2",
               "control_b3" = "darkgreen",
               "beta_b1" = "tan",
               "beta_b3" = "orangered2",
               "red_b1" = "lavenderblush3",
               "red_b3" = "darkred"),
    title = 'Pairs plot', plotaxes = FALSE,
    margingaps = unit(c(-0.01, -0.01, -0.01, -0.01), 'cm'))

period

pairsplot(p,
    components = getComponents(p, c(1:10)),
    triangle = TRUE, trianglelabSize = 12,
    hline = 0, vline = 0,
    pointSize = 0.4,
    gridlines.major = FALSE, gridlines.minor = FALSE,
    colby = 'period',
    colkey = c("b1" = "darkgray",
               "b3" = "pink"),
    title = 'Pairs plot', plotaxes = FALSE,
    margingaps = unit(c(-0.01, -0.01, -0.01, -0.01), 'cm'))

sex

Are there any obvious clusterings when colored by sex?

  pairsplot(p,
    components = getComponents(p, c(1:10)),
    triangle = TRUE, trianglelabSize = 12,
    hline = 0, vline = 0,
    pointSize = 0.4,
    gridlines.major = FALSE, gridlines.minor = FALSE,
    colby = 'sex', 
    colkey = c("M" = "red",
               "F" = "purple"),
    title = 'Pairs plot', plotaxes = FALSE,
    margingaps = unit(c(-0.01, -0.01, -0.01, -0.01), 'cm'))

Eigen corplots

This is a cool way to explore the correlations between the metadata and the PCs! I want to look at how the metavariables correlate with PCs that account for 80% variation in the dataset.

Again: How many PCs do we need to capture at least 80% variance?

which(cumsum(p$variance) > 80)[1]
## PC19 
##   19
  eigencorplot(p,
    components = getComponents(p, 1:which(cumsum(p$variance) > 80)[1]), # get components that account for 80% variance
    metavars = colnames(metadata_forPCAtools),
    col = c('darkblue', 'blue2', 'gray', 'red2', 'darkred'),
    cexCorval = 0.7,
    colCorval = 'white',
    fontCorval = 2,
    posLab = 'bottomleft',
    rotLabX = 45,
    posColKey = 'top',
    cexLabColKey = 1.5,
    scale = TRUE,
    main = 'PC1-15 metadata correlations',
    colFrame = 'white',
    plotRsquared = FALSE)

  eigencorplot(p,
    components = getComponents(p, 1:which(cumsum(p$variance) > 80)[1]),
    metavars = colnames(metadata_forPCAtools),
    col = c('white', 'cornsilk1', 'gold', 'forestgreen', 'darkgreen'),
    cexCorval = 1.2,
    fontCorval = 2,
    posLab = 'all',
    rotLabX = 45,
    scale = TRUE,
    main = bquote(Principal ~ component ~ Spearman ~ r^2 ~ metadata ~ correlates),
    plotRsquared = TRUE,
    corFUN = 'spearman',
    corUSE = 'pairwise.complete.obs',
    corMultipleTestCorrection = 'BH',
    signifSymbols = c('****', '***', '**', '*', ''),
    signifCutpoints = c(0, 0.0001, 0.001, 0.01, 0.05, 1))

Univariate analysis

Wrangle data

# using the most convenient df to convert to tidy
df_for_stats <- Data_forMPCA %>%
  pivot_longer(21:ncol(.),
               names_to = "mz_rt",
               values_to = "rel_abund_log2") %>%
  unite("treatment_period", "treatment", "period", sep = "_", remove = FALSE) %>%
  mutate_at("treatment", as.factor)
# turn off sci notation outputs
options(scipen = 999)

Parametric tests

ANOVA across treatment timepoints

df_for_stats$treatment_period <- as.factor(df_for_stats$treatment_period)

trt_anova_output_df <- df_for_stats %>% 
  dplyr::select(subject, sample, treatment_period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  anova_test(rel_abund_log2 ~ treatment_period, wid = subject,
             detailed = TRUE) %>%
  adjust_pvalue(method = "BH") %>%
  as.data.frame()


trt_anova_sig <- trt_anova_output_df %>%
  filter(p.adj < .05)

head(trt_anova_sig)
##              mz_rt           Effect    SSn    SSd DFn DFd     F        p p<.05
## 1 1334.2417_10.855 treatment_period  5.305 14.827   5  64 4.579 0.001000     *
## 2  1335.245_10.854 treatment_period  4.803 11.811   5  64 5.205 0.000453     *
## 3  1554.1226_7.773 treatment_period  1.342  3.604   5  64 4.766 0.000916     *
## 4  1561.2028_9.038 treatment_period  3.484 10.028   5  64 4.447 0.002000     *
## 5   201.0226_0.688 treatment_period 31.378 91.809   5  64 4.375 0.002000     *
## 6    244.908_0.706 treatment_period  4.986 13.922   5  64 4.585 0.001000     *
##     ges      p.adj
## 1 0.263 0.02890909
## 2 0.289 0.02274537
## 3 0.271 0.02890909
## 4 0.258 0.04892308
## 5 0.255 0.04892308
## 6 0.264 0.02890909
# how many significant features?
nrow(trt_anova_sig)
## [1] 39
trt_period_ANOVA_tukey <- df_for_stats %>% 
  dplyr::select(subject, sample, treatment_period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  tukey_hsd(rel_abund_log2 ~ treatment_period, wid = subject)

trt_tukeyHSD_sig <- trt_period_ANOVA_tukey %>%
  filter(p.adj < .05)

t tests (unpaired and paired)

Paired control

# run paired t-tests for control intervention
ctrl_t.test_paired <- df_for_stats %>%
  filter(treatment == "control") %>%
 dplyr::select(subject, period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ period, 
         paired = TRUE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
ctrl_t.test_paired_sig <- ctrl_t.test_paired %>%
  filter(p < 0.05)
kable(ctrl_t.test_paired_sig)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
1008.5435_7.813 rel_abund_log2 b1 b3 11 11 -2.398326 10 0.0374000 *
1061.6776_3.089 rel_abund_log2 b1 b3 11 11 2.649027 10 0.0244000 *
1235.798_10.088 rel_abund_log2 b1 b3 11 11 2.718321 10 0.0216000 *
1279.8241_10.52 rel_abund_log2 b1 b3 11 11 3.889474 10 0.0030100 **
1334.2417_10.855 rel_abund_log2 b1 b3 11 11 3.970460 10 0.0026400 **
1335.245_10.854 rel_abund_log2 b1 b3 11 11 4.756644 10 0.0007720 ***
1394.0685_5.684 rel_abund_log2 b1 b3 11 11 -2.994221 10 0.0135000 *
151.0261_0.612 rel_abund_log2 b1 b3 11 11 -3.352314 10 0.0073400 **
1554.1226_7.773 rel_abund_log2 b1 b3 11 11 5.268520 10 0.0003640 ***
1555.1258_7.773 rel_abund_log2 b1 b3 11 11 5.041887 10 0.0005050 ***
1598.1714_7.758 rel_abund_log2 b1 b3 11 11 3.278484 10 0.0083100 **
1600.0951_6.94 rel_abund_log2 b1 b3 11 11 -2.493591 10 0.0318000 *
1605.0902_6.358 rel_abund_log2 b1 b3 11 11 2.905978 10 0.0157000 *
1616.1136_7.768 rel_abund_log2 b1 b3 11 11 2.966338 10 0.0141000 *
1632.139_7.776 rel_abund_log2 b1 b3 11 11 3.619990 10 0.0046900 **
1633.1422_7.775 rel_abund_log2 b1 b3 11 11 4.370406 10 0.0014000 **
1637.3241_10.442 rel_abund_log2 b1 b3 11 11 -2.441127 10 0.0348000 *
1646.3475_10.439 rel_abund_log2 b1 b3 11 11 -4.320767 10 0.0015100 **
1654.1535_8.02 rel_abund_log2 b1 b3 11 11 -2.344590 10 0.0410000 *
1655.1569_8.02 rel_abund_log2 b1 b3 11 11 -3.128094 10 0.0107000 *
1664.3521_10.59 rel_abund_log2 b1 b3 11 11 3.587703 10 0.0049500 **
1665.3553_10.589 rel_abund_log2 b1 b3 11 11 4.222488 10 0.0017600 **
1666.3553_10.589 rel_abund_log2 b1 b3 11 11 3.570495 10 0.0050900 **
167.021_0.602 rel_abund_log2 b1 b3 11 11 -3.367841 10 0.0071500 **
1674.3803_10.59 rel_abund_log2 b1 b3 11 11 3.733095 10 0.0038900 **
1675.384_10.589 rel_abund_log2 b1 b3 11 11 3.328586 10 0.0076400 **
188.9862_0.644 rel_abund_log2 b1 b3 11 11 -4.406827 10 0.0013200 **
201.0226_0.688 rel_abund_log2 b1 b3 11 11 2.352607 10 0.0405000 *
203.0013_0.66 rel_abund_log2 b1 b3 11 11 -2.574806 10 0.0277000 *
213.0223_0.689 rel_abund_log2 b1 b3 11 11 -4.470479 10 0.0012000 **
239.0923_0.975 rel_abund_log2 b1 b3 11 11 2.481271 10 0.0325000 *
288.9363_0.485 rel_abund_log2 b1 b3 11 11 2.738739 10 0.0209000 *
291.0839_0.618 rel_abund_log2 b1 b3 11 11 2.850671 10 0.0172000 *
291.0953_0.67 rel_abund_log2 b1 b3 11 11 -3.203689 10 0.0094300 **
311.2224_2.465 rel_abund_log2 b1 b3 11 11 2.346546 10 0.0409000 *
352.0856_0.687 rel_abund_log2 b1 b3 11 11 -2.402798 10 0.0371000 *
362.9406_0.501 rel_abund_log2 b1 b3 11 11 -2.757099 10 0.0202000 *
383.1529_0.667 rel_abund_log2 b1 b3 11 11 -2.613511 10 0.0259000 *
391.2849_2.246 rel_abund_log2 b1 b3 11 11 3.636218 10 0.0045700 **
397.3681_5 rel_abund_log2 b1 b3 11 11 5.511253 10 0.0002580 ***
411.3837_5.349 rel_abund_log2 b1 b3 11 11 4.115092 10 0.0020900 **
437.0542_0.688 rel_abund_log2 b1 b3 11 11 -4.544781 10 0.0010700 **
441.3942_4.718 rel_abund_log2 b1 b3 11 11 6.009725 10 0.0001300 ***
462.1763_0.655 rel_abund_log2 b1 b3 11 11 -2.989895 10 0.0136000 *
506.3245_3.232 rel_abund_log2 b1 b3 11 11 2.988165 10 0.0136000 *
507.223_1.7 rel_abund_log2 b1 b3 11 11 -6.463711 10 0.0000722 ****
507.223_2.273 rel_abund_log2 b1 b3 11 11 -5.077456 10 0.0004800 ***
524.3351_3.376 rel_abund_log2 b1 b3 11 11 -3.404611 10 0.0067200 **
528.2631_0.691 rel_abund_log2 b1 b3 11 11 2.343265 10 0.0411000 *
539.4309_4.416 rel_abund_log2 b1 b3 11 11 2.944283 10 0.0147000 *
551.3582_4.841 rel_abund_log2 b1 b3 11 11 -8.525686 10 0.0000067 ****
557.4566_6.309 rel_abund_log2 b1 b3 11 11 2.667967 10 0.0236000 *
557.457_6.865 rel_abund_log2 b1 b3 11 11 2.417936 10 0.0362000 *
559.4719_6.867 rel_abund_log2 b1 b3 11 11 3.441306 10 0.0063200 **
566.3462_3.232 rel_abund_log2 b1 b3 11 11 2.581398 10 0.0274000 *
567.4621_4.643 rel_abund_log2 b1 b3 11 11 6.876930 10 0.0000431 ****
573.4515_4.266 rel_abund_log2 b1 b3 11 11 3.947276 10 0.0027400 **
573.4515_4.873 rel_abund_log2 b1 b3 11 11 4.352232 10 0.0014400 **
575.4672_5.354 rel_abund_log2 b1 b3 11 11 8.914095 10 0.0000045 ****
575.467_4.662 rel_abund_log2 b1 b3 11 11 4.239741 10 0.0017200 **
577.3738_4.918 rel_abund_log2 b1 b3 11 11 -6.880566 10 0.0000429 ****
579.3893_5.557 rel_abund_log2 b1 b3 11 11 -5.855048 10 0.0001610 ***
583.1735_0.618 rel_abund_log2 b1 b3 11 11 2.363323 10 0.0397000 *
586.3143_2.221 rel_abund_log2 b1 b3 11 11 2.599947 10 0.0265000 *
591.3894_5.174 rel_abund_log2 b1 b3 11 11 -3.921007 10 0.0028600 **
591.462_4.314 rel_abund_log2 b1 b3 11 11 4.839268 10 0.0006820 ***
591.462_4.651 rel_abund_log2 b1 b3 11 11 8.888686 10 0.0000046 ****
593.4778_4.664 rel_abund_log2 b1 b3 11 11 9.251220 10 0.0000032 ****
595.4933_4.953 rel_abund_log2 b1 b3 11 11 20.304358 10 0.0000000 ****
605.4051_5.422 rel_abund_log2 b1 b3 11 11 2.490637 10 0.0320000 *
618.308_3.232 rel_abund_log2 b1 b3 11 11 2.650333 10 0.0243000 *
627.1374_0.611 rel_abund_log2 b1 b3 11 11 4.157237 10 0.0019600 **
628.5437_10.491 rel_abund_log2 b1 b3 11 11 4.029686 10 0.0024000 **
634.3329_3.232 rel_abund_log2 b1 b3 11 11 3.443726 10 0.0062900 **
654.5589_10.54 rel_abund_log2 b1 b3 11 11 2.657957 10 0.0240000 *
656.5586_10.54 rel_abund_log2 b1 b3 11 11 3.064140 10 0.0120000 *
656.575_10.694 rel_abund_log2 b1 b3 11 11 3.607274 10 0.0047900 **
658.0669_0.628 rel_abund_log2 b1 b3 11 11 2.624871 10 0.0254000 *
676.6243_10.731 rel_abund_log2 b1 b3 11 11 -2.512566 10 0.0308000 *
684.6065_10.853 rel_abund_log2 b1 b3 11 11 4.303188 10 0.0015500 **
686.6207_10.914 rel_abund_log2 b1 b3 11 11 2.313184 10 0.0433000 *
696.6064_10.749 rel_abund_log2 b1 b3 11 11 -2.245948 10 0.0485000 *
711.6251_10.854 rel_abund_log2 b1 b3 11 11 3.668546 10 0.0043300 **
716.5225_8.139 rel_abund_log2 b1 b3 11 11 3.611030 10 0.0047600 **
723.5203_6.092 rel_abund_log2 b1 b3 11 11 -3.259499 10 0.0085800 **
733.5494_6.091 rel_abund_log2 b1 b3 11 11 -2.753136 10 0.0204000 *
738.507_7.269 rel_abund_log2 b1 b3 11 11 2.284240 10 0.0455000 *
746.5966_10.853 rel_abund_log2 b1 b3 11 11 3.830675 10 0.0033200 **
752.5589_9.222 rel_abund_log2 b1 b3 11 11 -2.627420 10 0.0253000 *
759.5646_6.287 rel_abund_log2 b1 b3 11 11 -2.542591 10 0.0292000 *
761.5803_7.053 rel_abund_log2 b1 b3 11 11 -3.748263 10 0.0037900 **
762.5643_8.206 rel_abund_log2 b1 b3 11 11 -2.825006 10 0.0180000 *
762.6216_10.854 rel_abund_log2 b1 b3 11 11 3.082883 10 0.0116000 *
767.5664_7.562 rel_abund_log2 b1 b3 11 11 -4.147683 10 0.0019900 **
771.5646_6.096 rel_abund_log2 b1 b3 11 11 -4.694516 10 0.0008490 ***
773.5806_6.749 rel_abund_log2 b1 b3 11 11 -2.764133 10 0.0200000 *
775.5965_7.563 rel_abund_log2 b1 b3 11 11 -3.234278 10 0.0089600 **
780.4705_7.867 rel_abund_log2 b1 b3 11 11 -2.657908 10 0.0240000 *
789.6114_7.911 rel_abund_log2 b1 b3 11 11 -2.243948 10 0.0487000 *
789.6116_8.177 rel_abund_log2 b1 b3 11 11 -3.164381 10 0.0101000 *
794.5464_7.772 rel_abund_log2 b1 b3 11 11 4.705066 10 0.0008350 ***
796.5458_7.771 rel_abund_log2 b1 b3 11 11 4.727941 10 0.0008070 ***
801.6117_7.833 rel_abund_log2 b1 b3 11 11 -2.452285 10 0.0341000 *
803.6275_8.771 rel_abund_log2 b1 b3 11 11 2.919414 10 0.0153000 *
804.5762_7.774 rel_abund_log2 b1 b3 11 11 5.108546 10 0.0004580 ***
806.4942_7.271 rel_abund_log2 b1 b3 11 11 4.820188 10 0.0007020 ***
810.5642_6.968 rel_abund_log2 b1 b3 11 11 2.602927 10 0.0264000 *
810.5647_7.467 rel_abund_log2 b1 b3 11 11 -3.368391 10 0.0071400 **
812.5436_6.468 rel_abund_log2 b1 b3 11 11 -2.338344 10 0.0415000 *
815.627_8.417 rel_abund_log2 b1 b3 11 11 -2.884629 10 0.0163000 *
818.6271_10.414 rel_abund_log2 b1 b3 11 11 4.481994 10 0.0011800 **
819.6141_8.816 rel_abund_log2 b1 b3 11 11 -2.278900 10 0.0459000 *
819.6141_9.024 rel_abund_log2 b1 b3 11 11 3.243826 10 0.0088100 **
820.5694_6.598 rel_abund_log2 b1 b3 11 11 2.232154 10 0.0497000 *
820.627_10.414 rel_abund_log2 b1 b3 11 11 4.813365 10 0.0007090 ***
821.565_7.768 rel_abund_log2 b1 b3 11 11 3.640792 10 0.0045300 **
821.6139_9.026 rel_abund_log2 b1 b3 11 11 4.184462 10 0.0018700 **
821.6152_8.817 rel_abund_log2 b1 b3 11 11 -3.428282 10 0.0064600 **
822.5774_8.941 rel_abund_log2 b1 b3 11 11 3.295648 10 0.0080700 **
823.6294_9.979 rel_abund_log2 b1 b3 11 11 4.039762 10 0.0023600 **
824.5441_6.359 rel_abund_log2 b1 b3 11 11 2.355183 10 0.0403000 *
824.5789_7.841 rel_abund_log2 b1 b3 11 11 -2.439056 10 0.0349000 *
827.6272_7.905 rel_abund_log2 b1 b3 11 11 -4.564604 10 0.0010300 **
828.6559_10.414 rel_abund_log2 b1 b3 11 11 3.789411 10 0.0035500 **
829.6431_8.816 rel_abund_log2 b1 b3 11 11 -2.933059 10 0.0150000 *
829.6432_9.024 rel_abund_log2 b1 b3 11 11 4.768161 10 0.0007590 ***
831.6576_9.28 rel_abund_log2 b1 b3 11 11 -2.923286 10 0.0152000 *
831.659_9.98 rel_abund_log2 b1 b3 11 11 3.935112 10 0.0028000 **
832.6067_8.94 rel_abund_log2 b1 b3 11 11 2.917804 10 0.0154000 *
832.6428_10.551 rel_abund_log2 b1 b3 11 11 -3.324458 10 0.0076900 **
833.5544_7.557 rel_abund_log2 b1 b3 11 11 -2.394152 10 0.0377000 *
833.6294_9.395 rel_abund_log2 b1 b3 11 11 -3.949641 10 0.0027300 **
833.6297_9.665 rel_abund_log2 b1 b3 11 11 -3.629255 10 0.0046200 **
834.5643_7.242 rel_abund_log2 b1 b3 11 11 -2.823948 10 0.0180000 *
835.5322_8.336 rel_abund_log2 b1 b3 11 11 3.124019 10 0.0108000 *
835.6457_10.444 rel_abund_log2 b1 b3 11 11 -2.576877 10 0.0276000 *
836.5434_6.295 rel_abund_log2 b1 b3 11 11 -2.726491 10 0.0213000 *
837.6571_10.552 rel_abund_log2 b1 b3 11 11 -3.234364 10 0.0089500 **
838.5955_8.279 rel_abund_log2 b1 b3 11 11 -2.469919 10 0.0331000 *
840.5749_7.321 rel_abund_log2 b1 b3 11 11 -2.468933 10 0.0332000 *
840.5749_7.471 rel_abund_log2 b1 b3 11 11 -3.126034 10 0.0108000 *
841.5661_6.75 rel_abund_log2 b1 b3 11 11 -5.215558 10 0.0003920 ***
841.6406_8.452 rel_abund_log2 b1 b3 11 11 -3.891593 10 0.0030000 **
842.6715_10.551 rel_abund_log2 b1 b3 11 11 -5.432362 10 0.0002880 ***
843.6586_9.396 rel_abund_log2 b1 b3 11 11 -3.554469 10 0.0052300 **
843.6587_9.666 rel_abund_log2 b1 b3 11 11 -4.167152 10 0.0019300 **
845.6746_10.439 rel_abund_log2 b1 b3 11 11 -2.415855 10 0.0363000 *
846.6588_10.643 rel_abund_log2 b1 b3 11 11 2.369900 10 0.0393000 *
847.6304_9.032 rel_abund_log2 b1 b3 11 11 -2.401890 10 0.0372000 *
848.5433_6.017 rel_abund_log2 b1 b3 11 11 -2.783976 10 0.0193000 *
849.6458_10.294 rel_abund_log2 b1 b3 11 11 3.160454 10 0.0102000 *
849.6616_10.589 rel_abund_log2 b1 b3 11 11 5.527135 10 0.0002520 ***
851.6615_10.59 rel_abund_log2 b1 b3 11 11 3.179822 10 0.0098200 **
853.6428_8.12 rel_abund_log2 b1 b3 11 11 -3.100457 10 0.0112000 *
854.5918_8.021 rel_abund_log2 b1 b3 11 11 -3.629941 10 0.0046100 **
854.6714_10.418 rel_abund_log2 b1 b3 11 11 -2.280952 10 0.0457000 *
855.6591_9.033 rel_abund_log2 b1 b3 11 11 -3.253318 10 0.0086700 **
856.5377_7.769 rel_abund_log2 b1 b3 11 11 3.062711 10 0.0120000 *
857.5409_7.768 rel_abund_log2 b1 b3 11 11 2.862867 10 0.0169000 *
857.6737_9.513 rel_abund_log2 b1 b3 11 11 -3.964069 10 0.0026700 **
857.6746_10.294 rel_abund_log2 b1 b3 11 11 2.642620 10 0.0246000 *
859.6907_10.59 rel_abund_log2 b1 b3 11 11 4.237116 10 0.0017200 **
860.6369_10.19 rel_abund_log2 b1 b3 11 11 3.260431 10 0.0085700 **
860.6919_10.384 rel_abund_log2 b1 b3 11 11 -3.061764 10 0.0120000 *
862.5261_7.47 rel_abund_log2 b1 b3 11 11 -2.306507 10 0.0438000 *
862.527_7.471 rel_abund_log2 b1 b3 11 11 -3.520338 10 0.0055400 **
862.6535_10.583 rel_abund_log2 b1 b3 11 11 2.252514 10 0.0480000 *
863.6765_10.683 rel_abund_log2 b1 b3 11 11 -3.154368 10 0.0103000 *
864.6108_7.878 rel_abund_log2 b1 b3 11 11 -2.406403 10 0.0369000 *
865.6758_10.678 rel_abund_log2 b1 b3 11 11 -2.242872 10 0.0488000 *
869.598_7.834 rel_abund_log2 b1 b3 11 11 -2.578977 10 0.0275000 *
871.5502_7.054 rel_abund_log2 b1 b3 11 11 -2.674593 10 0.0233000 *
871.6891_10.337 rel_abund_log2 b1 b3 11 11 -3.911534 10 0.0029100 **
872.5626_7.769 rel_abund_log2 b1 b3 11 11 5.274071 10 0.0003610 ***
872.5955_8.863 rel_abund_log2 b1 b3 11 11 -3.090235 10 0.0114000 *
872.6815_10.583 rel_abund_log2 b1 b3 11 11 4.914023 10 0.0006100 ***
874.6643_9.99 rel_abund_log2 b1 b3 11 11 -2.660490 10 0.0239000 *
876.5748_6.891 rel_abund_log2 b1 b3 11 11 -3.067863 10 0.0119000 *
878.584_5.681 rel_abund_log2 b1 b3 11 11 -2.468788 10 0.0332000 *
878.5901_7.193 rel_abund_log2 b1 b3 11 11 -2.513654 10 0.0307000 *
878.5903_7.305 rel_abund_log2 b1 b3 11 11 -6.308136 10 0.0000882 ****
878.5909_7.805 rel_abund_log2 b1 b3 11 11 -2.921379 10 0.0153000 *
881.6055_9.023 rel_abund_log2 b1 b3 11 11 3.636516 10 0.0045600 **
882.6209_8.855 rel_abund_log2 b1 b3 11 11 -2.424221 10 0.0358000 *
883.5331_7.753 rel_abund_log2 b1 b3 11 11 -4.792130 10 0.0007320 ***
883.6211_9.976 rel_abund_log2 b1 b3 11 11 4.199866 10 0.0018300 **
884.5687_8.94 rel_abund_log2 b1 b3 11 11 2.422232 10 0.0359000 *
887.599_8.816 rel_abund_log2 b1 b3 11 11 -2.514231 10 0.0307000 *
890.5493_8.144 rel_abund_log2 b1 b3 11 11 2.781392 10 0.0194000 *
895.6025_10.452 rel_abund_log2 b1 b3 11 11 3.027163 10 0.0127000 *
895.6211_9.665 rel_abund_log2 b1 b3 11 11 -2.511628 10 0.0308000 *
897.6305_9.024 rel_abund_log2 b1 b3 11 11 4.061240 10 0.0022800 **
903.5878_9.033 rel_abund_log2 b1 b3 11 11 -2.266245 10 0.0469000 *
911.6459_9.666 rel_abund_log2 b1 b3 11 11 -4.719156 10 0.0008170 ***
911.6461_9.397 rel_abund_log2 b1 b3 11 11 -3.955662 10 0.0027100 **
913.6162_9.035 rel_abund_log2 b1 b3 11 11 -2.708838 10 0.0220000 *
913.6613_10.438 rel_abund_log2 b1 b3 11 11 -2.360605 10 0.0399000 *
917.6482_10.589 rel_abund_log2 b1 b3 11 11 4.814375 10 0.0007080 ***
918.5543_7.768 rel_abund_log2 b1 b3 11 11 3.677322 10 0.0042700 **
918.5546_7.77 rel_abund_log2 b1 b3 11 11 2.998605 10 0.0134000 *
919.6483_10.59 rel_abund_log2 b1 b3 11 11 2.885889 10 0.0162000 *
920.6735_10.31 rel_abund_log2 b1 b3 11 11 -5.455495 10 0.0002790 ***
922.5774_7.695 rel_abund_log2 b1 b3 11 11 -2.624454 10 0.0254000 *
923.646_9.035 rel_abund_log2 b1 b3 11 11 -2.404971 10 0.0370000 *
923.6524_10.353 rel_abund_log2 b1 b3 11 11 -3.080048 10 0.0116000 *
924.518_7.766 rel_abund_log2 b1 b3 11 11 4.080322 10 0.0022100 **
925.6617_9.988 rel_abund_log2 b1 b3 11 11 -2.821525 10 0.0181000 *
927.677_10.59 rel_abund_log2 b1 b3 11 11 2.936365 10 0.0149000 *
930.5504_7.815 rel_abund_log2 b1 b3 11 11 -3.212695 10 0.0092900 **
931.5514_9.582 rel_abund_log2 b1 b3 11 11 2.553351 10 0.0287000 *
931.6162_9.992 rel_abund_log2 b1 b3 11 11 -2.624295 10 0.0254000 *
931.6162_9.999 rel_abund_log2 b1 b3 11 11 -2.662141 10 0.0238000 *
933.5855_8.781 rel_abund_log2 b1 b3 11 11 4.952301 10 0.0005770 ***
934.5326_7.772 rel_abund_log2 b1 b3 11 11 3.165492 10 0.0101000 *
939.6769_10.335 rel_abund_log2 b1 b3 11 11 -3.036580 10 0.0125000 *
943.5073_8.524 rel_abund_log2 b1 b3 11 11 2.505690 10 0.0311000 *
959.6018_9.026 rel_abund_log2 b1 b3 11 11 2.797465 10 0.0189000 *
962.5631_8.939 rel_abund_log2 b1 b3 11 11 2.259713 10 0.0474000 *
966.5651_8.147 rel_abund_log2 b1 b3 11 11 2.354157 10 0.0404000 *
968.5707_8.019 rel_abund_log2 b1 b3 11 11 -4.221800 10 0.0017700 **
971.6542_9.988 rel_abund_log2 b1 b3 11 11 -2.726955 10 0.0213000 *
985.616_9.034 rel_abund_log2 b1 b3 11 11 -2.262055 10 0.0472000 *
# how many are significant?
nrow(ctrl_t.test_paired_sig)
## [1] 222
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA

sig_overlap_ctrl_paired <- inner_join(ctrl_t.test_paired_sig,
                                   trt_tukeyHSD_sig,
                                   by = "mz_rt",
                                   suffix = c(".t-test", ".tukeys"))
Mummichog list
paired_ctrl_for_mummichog <- ctrl_t.test_paired %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(paired_ctrl_for_mummichog,
          "for mummichog analysis/t-test-res-ctrl-paired.csv")

Paired beta

# run paired t-tests for control intervention
beta_t.test_paired <- df_for_stats %>%
  filter(treatment == "beta") %>%
 dplyr::select(subject, period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ period, 
         paired = TRUE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
beta_t.test_paired_sig <- beta_t.test_paired %>%
  filter(p < 0.05)
kable(beta_t.test_paired_sig)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
117.0557_0.669 rel_abund_log2 b1 b3 12 12 2.934820 11 0.0136000 *
1235.798_10.088 rel_abund_log2 b1 b3 12 12 3.381989 11 0.0061200 **
1249.8137_10.468 rel_abund_log2 b1 b3 12 12 -2.783987 11 0.0178000 *
1279.8241_10.52 rel_abund_log2 b1 b3 12 12 3.378153 11 0.0061600 **
128.0352_0.617 rel_abund_log2 b1 b3 12 12 -2.332737 11 0.0397000 *
1334.2417_10.855 rel_abund_log2 b1 b3 12 12 2.566275 11 0.0262000 *
1335.245_10.854 rel_abund_log2 b1 b3 12 12 3.456240 11 0.0053700 **
1491.1091_6.544 rel_abund_log2 b1 b3 12 12 -2.972539 11 0.0127000 *
1554.1226_7.773 rel_abund_log2 b1 b3 12 12 2.358112 11 0.0379000 *
1558.1192_8.016 rel_abund_log2 b1 b3 12 12 -2.811807 11 0.0169000 *
1561.2028_9.038 rel_abund_log2 b1 b3 12 12 -3.619617 11 0.0040300 **
1598.0913_6.94 rel_abund_log2 b1 b3 12 12 -2.255567 11 0.0454000 *
1599.0952_6.94 rel_abund_log2 b1 b3 12 12 -2.283561 11 0.0433000 *
1602.1228_7.339 rel_abund_log2 b1 b3 12 12 -2.546669 11 0.0272000 *
1616.1136_7.768 rel_abund_log2 b1 b3 12 12 2.355819 11 0.0381000 *
1633.1422_7.775 rel_abund_log2 b1 b3 12 12 3.484757 11 0.0051100 **
1637.3241_10.442 rel_abund_log2 b1 b3 12 12 -3.336032 11 0.0066400 **
1641.1859_8.06 rel_abund_log2 b1 b3 12 12 -2.299035 11 0.0421000 *
1646.3475_10.439 rel_abund_log2 b1 b3 12 12 -2.612640 11 0.0241000 *
1655.1569_8.02 rel_abund_log2 b1 b3 12 12 -2.262519 11 0.0449000 *
1664.3521_10.59 rel_abund_log2 b1 b3 12 12 3.629224 11 0.0039600 **
1665.3553_10.589 rel_abund_log2 b1 b3 12 12 3.563350 11 0.0044500 **
1669.2155_8.46 rel_abund_log2 b1 b3 12 12 -2.495141 11 0.0298000 *
1670.349_9.987 rel_abund_log2 b1 b3 12 12 -2.643694 11 0.0228000 *
1674.3803_10.59 rel_abund_log2 b1 b3 12 12 3.221093 11 0.0081400 **
1675.384_10.589 rel_abund_log2 b1 b3 12 12 3.354842 11 0.0064200 **
172.9913_0.642 rel_abund_log2 b1 b3 12 12 3.157009 11 0.0091300 **
188.9862_0.644 rel_abund_log2 b1 b3 12 12 -3.262414 11 0.0075700 **
201.0226_0.688 rel_abund_log2 b1 b3 12 12 2.701885 11 0.0206000 *
201.0575_0.644 rel_abund_log2 b1 b3 12 12 2.444664 11 0.0326000 *
229.0537_0.703 rel_abund_log2 b1 b3 12 12 -2.809324 11 0.0170000 *
230.9967_0.644 rel_abund_log2 b1 b3 12 12 -3.087077 11 0.0103000 *
291.0839_0.618 rel_abund_log2 b1 b3 12 12 2.240244 11 0.0467000 *
352.0856_0.687 rel_abund_log2 b1 b3 12 12 -4.295763 11 0.0012600 **
362.9406_0.501 rel_abund_log2 b1 b3 12 12 -2.729799 11 0.0196000 *
397.2049_0.693 rel_abund_log2 b1 b3 12 12 2.627017 11 0.0235000 *
397.3681_5 rel_abund_log2 b1 b3 12 12 4.147661 11 0.0016200 **
411.3837_5.349 rel_abund_log2 b1 b3 12 12 6.602477 11 0.0000385 ****
436.2827_3.522 rel_abund_log2 b1 b3 12 12 -3.789484 11 0.0030000 **
437.0542_0.688 rel_abund_log2 b1 b3 12 12 -3.234442 11 0.0079500 **
441.3942_4.718 rel_abund_log2 b1 b3 12 12 4.170438 11 0.0015600 **
462.1763_0.655 rel_abund_log2 b1 b3 12 12 -5.649381 11 0.0001490 ***
464.3013_0.999 rel_abund_log2 b1 b3 12 12 2.762717 11 0.0185000 *
464.314_4.127 rel_abund_log2 b1 b3 12 12 -2.220324 11 0.0483000 *
467.3735_4.306 rel_abund_log2 b1 b3 12 12 2.651755 11 0.0225000 *
478.2933_3.354 rel_abund_log2 b1 b3 12 12 3.711591 11 0.0034300 **
506.3245_3.232 rel_abund_log2 b1 b3 12 12 2.381037 11 0.0364000 *
507.223_1.7 rel_abund_log2 b1 b3 12 12 -9.672208 11 0.0000010 ****
507.223_2.273 rel_abund_log2 b1 b3 12 12 -7.745145 11 0.0000089 ****
511.3997_4.453 rel_abund_log2 b1 b3 12 12 6.399569 11 0.0000508 ****
514.2836_0.69 rel_abund_log2 b1 b3 12 12 2.934805 11 0.0136000 *
519.347_6.861 rel_abund_log2 b1 b3 12 12 2.627030 11 0.0235000 *
524.3351_3.376 rel_abund_log2 b1 b3 12 12 -2.633968 11 0.0232000 *
526.3144_2.683 rel_abund_log2 b1 b3 12 12 -3.371109 11 0.0062400 **
528.2631_0.691 rel_abund_log2 b1 b3 12 12 2.440700 11 0.0328000 *
539.4309_4.416 rel_abund_log2 b1 b3 12 12 2.407874 11 0.0347000 *
546.1884_6.859 rel_abund_log2 b1 b3 12 12 -2.293405 11 0.0425000 *
551.3582_4.841 rel_abund_log2 b1 b3 12 12 -9.410498 11 0.0000014 ****
554.3456_3.441 rel_abund_log2 b1 b3 12 12 -3.300291 11 0.0070700 **
558.3148_3.234 rel_abund_log2 b1 b3 12 12 3.113373 11 0.0098700 **
559.4719_6.867 rel_abund_log2 b1 b3 12 12 4.712253 11 0.0006370 ***
566.3462_3.232 rel_abund_log2 b1 b3 12 12 3.036030 11 0.0113000 *
567.4621_4.643 rel_abund_log2 b1 b3 12 12 4.257497 11 0.0013500 **
573.4515_4.266 rel_abund_log2 b1 b3 12 12 5.282792 11 0.0002590 ***
575.4672_5.354 rel_abund_log2 b1 b3 12 12 4.902049 11 0.0004700 ***
575.467_4.662 rel_abund_log2 b1 b3 12 12 5.473259 11 0.0001940 ***
577.3738_4.918 rel_abund_log2 b1 b3 12 12 -12.254423 11 0.0000001 ****
579.3893_5.557 rel_abund_log2 b1 b3 12 12 -10.034969 11 0.0000007 ****
591.3894_5.174 rel_abund_log2 b1 b3 12 12 -5.435694 11 0.0002050 ***
591.462_4.314 rel_abund_log2 b1 b3 12 12 2.390997 11 0.0358000 *
591.462_4.651 rel_abund_log2 b1 b3 12 12 4.210972 11 0.0014600 **
593.4778_4.664 rel_abund_log2 b1 b3 12 12 5.258091 11 0.0002690 ***
594.3768_3.858 rel_abund_log2 b1 b3 12 12 2.578956 11 0.0256000 *
595.4933_4.953 rel_abund_log2 b1 b3 12 12 13.598942 11 0.0000000 ****
605.1555_0.616 rel_abund_log2 b1 b3 12 12 2.816816 11 0.0168000 *
618.308_3.232 rel_abund_log2 b1 b3 12 12 2.254115 11 0.0456000 *
624.3379_0.689 rel_abund_log2 b1 b3 12 12 -2.882873 11 0.0149000 *
634.3329_3.232 rel_abund_log2 b1 b3 12 12 2.857638 11 0.0156000 *
640.5796_10.729 rel_abund_log2 b1 b3 12 12 -2.639749 11 0.0230000 *
654.5589_10.54 rel_abund_log2 b1 b3 12 12 2.259625 11 0.0451000 *
656.575_10.694 rel_abund_log2 b1 b3 12 12 3.001030 11 0.0121000 *
664.5877_10.541 rel_abund_log2 b1 b3 12 12 3.033159 11 0.0114000 *
668.5747_10.647 rel_abund_log2 b1 b3 12 12 -2.812232 11 0.0169000 *
670.5743_10.646 rel_abund_log2 b1 b3 12 12 -2.404081 11 0.0350000 *
674.6039_10.834 rel_abund_log2 b1 b3 12 12 -5.534071 11 0.0001770 ***
676.6243_10.731 rel_abund_log2 b1 b3 12 12 -4.813784 11 0.0005410 ***
678.6034_10.645 rel_abund_log2 b1 b3 12 12 -2.592950 11 0.0250000 *
678.6402_10.885 rel_abund_log2 b1 b3 12 12 -3.832092 11 0.0027800 **
682.6332_10.835 rel_abund_log2 b1 b3 12 12 -3.893687 11 0.0025000 **
684.6065_10.853 rel_abund_log2 b1 b3 12 12 3.331193 11 0.0067000 **
696.3033_3.233 rel_abund_log2 b1 b3 12 12 2.674102 11 0.0216000 *
696.6064_10.749 rel_abund_log2 b1 b3 12 12 -4.484943 11 0.0009240 ***
698.3189_3.775 rel_abund_log2 b1 b3 12 12 -3.224906 11 0.0080900 **
698.5121_7.962 rel_abund_log2 b1 b3 12 12 -3.544746 11 0.0045900 **
698.6108_10.776 rel_abund_log2 b1 b3 12 12 -2.904987 11 0.0143000 *
698.6217_10.912 rel_abund_log2 b1 b3 12 12 -2.861408 11 0.0155000 *
700.6211_10.914 rel_abund_log2 b1 b3 12 12 -3.433943 11 0.0055800 **
705.5178_5.308 rel_abund_log2 b1 b3 12 12 -3.494284 11 0.0050200 **
716.5225_8.139 rel_abund_log2 b1 b3 12 12 2.878249 11 0.0150000 *
717.5179_5.106 rel_abund_log2 b1 b3 12 12 -3.753869 11 0.0031900 **
721.549_6 rel_abund_log2 b1 b3 12 12 -4.722297 11 0.0006270 ***
722.5123_7.861 rel_abund_log2 b1 b3 12 12 -3.082196 11 0.0104000 *
724.5276_8.3 rel_abund_log2 b1 b3 12 12 -4.621077 11 0.0007390 ***
724.8722_0.515 rel_abund_log2 b1 b3 12 12 -2.377499 11 0.0367000 *
725.6412_10.916 rel_abund_log2 b1 b3 12 12 -2.422712 11 0.0338000 *
726.5434_9.157 rel_abund_log2 b1 b3 12 12 -2.271749 11 0.0442000 *
740.5225_7.515 rel_abund_log2 b1 b3 12 12 2.294404 11 0.0424000 *
744.5538_9.321 rel_abund_log2 b1 b3 12 12 4.235466 11 0.0014000 **
746.5966_10.853 rel_abund_log2 b1 b3 12 12 4.712025 11 0.0006380 ***
750.5436_9.042 rel_abund_log2 b1 b3 12 12 -3.482944 11 0.0051200 **
752.5591_9.514 rel_abund_log2 b1 b3 12 12 -2.844641 11 0.0159000 *
759.5646_6.287 rel_abund_log2 b1 b3 12 12 -3.042100 11 0.0112000 *
761.5803_7.053 rel_abund_log2 b1 b3 12 12 -2.873554 11 0.0151000 *
762.5643_8.206 rel_abund_log2 b1 b3 12 12 -2.651552 11 0.0225000 *
762.6216_10.854 rel_abund_log2 b1 b3 12 12 2.290455 11 0.0427000 *
764.5798_8.343 rel_abund_log2 b1 b3 12 12 -2.417121 11 0.0342000 *
765.5735_6.098 rel_abund_log2 b1 b3 12 12 -2.476697 11 0.0308000 *
771.5646_6.096 rel_abund_log2 b1 b3 12 12 -2.518160 11 0.0286000 *
776.5351_7.576 rel_abund_log2 b1 b3 12 12 -3.096590 11 0.0102000 *
776.5354_7.574 rel_abund_log2 b1 b3 12 12 -2.943227 11 0.0134000 *
777.6118_7.986 rel_abund_log2 b1 b3 12 12 -2.867323 11 0.0153000 *
778.5745_10.284 rel_abund_log2 b1 b3 12 12 -2.625289 11 0.0236000 *
780.4705_7.867 rel_abund_log2 b1 b3 12 12 -3.918873 11 0.0024000 **
786.5646_7.575 rel_abund_log2 b1 b3 12 12 -3.707665 11 0.0034600 **
788.5437_6.549 rel_abund_log2 b1 b3 12 12 -2.376981 11 0.0367000 *
789.6114_7.911 rel_abund_log2 b1 b3 12 12 -3.829449 11 0.0028000 **
789.6116_8.177 rel_abund_log2 b1 b3 12 12 -3.565200 11 0.0044300 **
790.4993_7.863 rel_abund_log2 b1 b3 12 12 -3.524980 11 0.0047600 **
790.5953_8.511 rel_abund_log2 b1 b3 12 12 3.029372 11 0.0115000 *
792.8596_0.515 rel_abund_log2 b1 b3 12 12 -2.512410 11 0.0289000 *
793.5985_8.765 rel_abund_log2 b1 b3 12 12 2.687496 11 0.0211000 *
800.5357_7.469 rel_abund_log2 b1 b3 12 12 -3.465914 11 0.0052800 **
801.5445_6.55 rel_abund_log2 b1 b3 12 12 -2.868405 11 0.0153000 *
803.6275_8.771 rel_abund_log2 b1 b3 12 12 2.664602 11 0.0220000 *
804.5762_7.774 rel_abund_log2 b1 b3 12 12 2.657796 11 0.0223000 *
804.6308_8.768 rel_abund_log2 b1 b3 12 12 2.894348 11 0.0146000 *
805.6426_9.222 rel_abund_log2 b1 b3 12 12 -2.310559 11 0.0413000 *
806.6057_10.613 rel_abund_log2 b1 b3 12 12 -2.264047 11 0.0448000 *
808.5018_9.051 rel_abund_log2 b1 b3 12 12 -3.982237 11 0.0021500 **
810.5647_7.467 rel_abund_log2 b1 b3 12 12 -4.545558 11 0.0008360 ***
812.5436_6.468 rel_abund_log2 b1 b3 12 12 -3.950371 11 0.0022700 **
812.58_7.898 rel_abund_log2 b1 b3 12 12 -3.993280 11 0.0021100 **
815.627_8.417 rel_abund_log2 b1 b3 12 12 -2.404808 11 0.0349000 *
816.5308_6.915 rel_abund_log2 b1 b3 12 12 -2.337500 11 0.0393000 *
816.5751_7.553 rel_abund_log2 b1 b3 12 12 -2.587367 11 0.0253000 *
818.5462_7.192 rel_abund_log2 b1 b3 12 12 3.590115 11 0.0042400 **
818.5462_7.337 rel_abund_log2 b1 b3 12 12 -3.160285 11 0.0090700 **
818.6271_10.414 rel_abund_log2 b1 b3 12 12 5.399015 11 0.0002170 ***
819.6141_8.816 rel_abund_log2 b1 b3 12 12 -5.841126 11 0.0001120 ***
819.6141_9.024 rel_abund_log2 b1 b3 12 12 3.914524 11 0.0024200 **
820.5155_3.079 rel_abund_log2 b1 b3 12 12 -2.886397 11 0.0148000 *
820.5462_7.34 rel_abund_log2 b1 b3 12 12 -2.296972 11 0.0423000 *
820.5463_7.196 rel_abund_log2 b1 b3 12 12 2.257837 11 0.0453000 *
820.627_10.414 rel_abund_log2 b1 b3 12 12 3.933180 11 0.0023400 **
821.6139_9.026 rel_abund_log2 b1 b3 12 12 4.331717 11 0.0011900 **
822.5774_8.941 rel_abund_log2 b1 b3 12 12 2.675168 11 0.0216000 *
823.6294_9.979 rel_abund_log2 b1 b3 12 12 4.692842 11 0.0006580 ***
824.5433_5.925 rel_abund_log2 b1 b3 12 12 -2.818684 11 0.0167000 *
824.5771_8.938 rel_abund_log2 b1 b3 12 12 3.480650 11 0.0051400 **
824.5789_7.841 rel_abund_log2 b1 b3 12 12 -4.800002 11 0.0005530 ***
826.5606_6.953 rel_abund_log2 b1 b3 12 12 -2.320523 11 0.0405000 *
827.6272_7.905 rel_abund_log2 b1 b3 12 12 -3.811589 11 0.0028800 **
828.5668_8.612 rel_abund_log2 b1 b3 12 12 -4.366137 11 0.0011200 **
828.5759_7.19 rel_abund_log2 b1 b3 12 12 3.219035 11 0.0081700 **
828.5759_7.339 rel_abund_log2 b1 b3 12 12 -2.906686 11 0.0143000 *
828.6559_10.414 rel_abund_log2 b1 b3 12 12 3.170122 11 0.0089200 **
829.6431_8.816 rel_abund_log2 b1 b3 12 12 -2.927992 11 0.0137000 *
829.6432_9.024 rel_abund_log2 b1 b3 12 12 4.504711 11 0.0008940 ***
830.5815_7.188 rel_abund_log2 b1 b3 12 12 2.847985 11 0.0159000 *
831.6576_9.28 rel_abund_log2 b1 b3 12 12 -4.136092 11 0.0016500 **
831.659_9.98 rel_abund_log2 b1 b3 12 12 3.910747 11 0.0024300 **
832.6067_8.94 rel_abund_log2 b1 b3 12 12 2.813332 11 0.0169000 *
832.6428_10.551 rel_abund_log2 b1 b3 12 12 -2.972107 11 0.0127000 *
833.5544_7.557 rel_abund_log2 b1 b3 12 12 -3.563603 11 0.0044400 **
833.6294_9.395 rel_abund_log2 b1 b3 12 12 -3.704948 11 0.0034700 **
834.5643_7.242 rel_abund_log2 b1 b3 12 12 -2.484852 11 0.0303000 *
835.5322_8.336 rel_abund_log2 b1 b3 12 12 4.707655 11 0.0006420 ***
835.6457_10.444 rel_abund_log2 b1 b3 12 12 -2.471447 11 0.0310000 *
836.5434_6.295 rel_abund_log2 b1 b3 12 12 -2.757764 11 0.0186000 *
837.6571_10.552 rel_abund_log2 b1 b3 12 12 -2.780186 11 0.0179000 *
838.5956_8.612 rel_abund_log2 b1 b3 12 12 -2.656729 11 0.0223000 *
840.5304_6.407 rel_abund_log2 b1 b3 12 12 -3.822264 11 0.0028300 **
840.5749_7.321 rel_abund_log2 b1 b3 12 12 -3.340764 11 0.0065800 **
840.5749_7.471 rel_abund_log2 b1 b3 12 12 -4.627852 11 0.0007310 ***
841.5661_6.75 rel_abund_log2 b1 b3 12 12 -2.719296 11 0.0200000 *
841.6406_8.452 rel_abund_log2 b1 b3 12 12 -4.113938 11 0.0017200 **
842.5154_6.099 rel_abund_log2 b1 b3 12 12 -2.684742 11 0.0212000 *
842.5905_7.891 rel_abund_log2 b1 b3 12 12 -4.641280 11 0.0007150 ***
843.6586_9.396 rel_abund_log2 b1 b3 12 12 -4.736375 11 0.0006130 ***
845.5636_7.343 rel_abund_log2 b1 b3 12 12 -3.440275 11 0.0055200 **
845.6746_10.439 rel_abund_log2 b1 b3 12 12 -2.292469 11 0.0426000 *
846.6588_10.643 rel_abund_log2 b1 b3 12 12 3.546346 11 0.0045800 **
847.6304_9.032 rel_abund_log2 b1 b3 12 12 -2.535210 11 0.0277000 *
847.6455_10.298 rel_abund_log2 b1 b3 12 12 4.288894 11 0.0012800 **
848.5114_9.046 rel_abund_log2 b1 b3 12 12 -3.722530 11 0.0033700 **
848.577_8.458 rel_abund_log2 b1 b3 12 12 -2.528468 11 0.0280000 *
849.6462_9.988 rel_abund_log2 b1 b3 12 12 -3.677868 11 0.0036400 **
849.6616_10.589 rel_abund_log2 b1 b3 12 12 4.277192 11 0.0013000 **
850.5595_6.407 rel_abund_log2 b1 b3 12 12 -4.652950 11 0.0007020 ***
851.6615_10.59 rel_abund_log2 b1 b3 12 12 2.948328 11 0.0132000 *
853.619_10.659 rel_abund_log2 b1 b3 12 12 -4.213208 11 0.0014500 **
853.6428_8.12 rel_abund_log2 b1 b3 12 12 -5.388563 11 0.0002200 ***
854.5519_7.576 rel_abund_log2 b1 b3 12 12 -4.247337 11 0.0013700 **
854.5906_7.701 rel_abund_log2 b1 b3 12 12 -3.798355 11 0.0029500 **
854.5918_8.021 rel_abund_log2 b1 b3 12 12 -2.961798 11 0.0129000 *
855.59_8.755 rel_abund_log2 b1 b3 12 12 2.636432 11 0.0231000 *
855.6591_9.033 rel_abund_log2 b1 b3 12 12 -3.069368 11 0.0107000 *
856.6051_8.21 rel_abund_log2 b1 b3 12 12 2.387966 11 0.0360000 *
856.6871_10.641 rel_abund_log2 b1 b3 12 12 4.595975 11 0.0007700 ***
857.6737_9.513 rel_abund_log2 b1 b3 12 12 -9.480190 11 0.0000013 ****
857.6746_10.294 rel_abund_log2 b1 b3 12 12 3.673240 11 0.0036700 **
857.6749_9.986 rel_abund_log2 b1 b3 12 12 -3.130171 11 0.0095700 **
859.5338_7.864 rel_abund_log2 b1 b3 12 12 -2.642053 11 0.0229000 *
859.6907_10.59 rel_abund_log2 b1 b3 12 12 3.673498 11 0.0036700 **
860.6369_10.19 rel_abund_log2 b1 b3 12 12 4.291580 11 0.0012700 **
860.6919_10.384 rel_abund_log2 b1 b3 12 12 -5.527332 11 0.0001790 ***
862.5261_7.47 rel_abund_log2 b1 b3 12 12 -3.872158 11 0.0026000 **
862.527_7.471 rel_abund_log2 b1 b3 12 12 -3.919768 11 0.0023900 **
862.6535_10.583 rel_abund_log2 b1 b3 12 12 2.224550 11 0.0480000 *
862.664_10.445 rel_abund_log2 b1 b3 12 12 -2.523894 11 0.0283000 *
863.5644_9.582 rel_abund_log2 b1 b3 12 12 9.018235 11 0.0000021 ****
863.6765_10.683 rel_abund_log2 b1 b3 12 12 -4.585805 11 0.0007830 ***
864.5747_7.263 rel_abund_log2 b1 b3 12 12 -2.456400 11 0.0319000 *
865.6758_10.678 rel_abund_log2 b1 b3 12 12 -2.778335 11 0.0180000 *
866.6268_8.879 rel_abund_log2 b1 b3 12 12 2.714971 11 0.0201000 *
868.5303_7.476 rel_abund_log2 b1 b3 12 12 -2.594796 11 0.0249000 *
870.5618_7.814 rel_abund_log2 b1 b3 12 12 -2.787781 11 0.0177000 *
871.5805_8.017 rel_abund_log2 b1 b3 12 12 -3.059198 11 0.0109000 *
871.6147_8.768 rel_abund_log2 b1 b3 12 12 2.383383 11 0.0363000 *
871.6891_10.337 rel_abund_log2 b1 b3 12 12 -6.286003 11 0.0000595 ****
872.5626_7.769 rel_abund_log2 b1 b3 12 12 2.846966 11 0.0159000 *
872.6815_10.583 rel_abund_log2 b1 b3 12 12 2.762710 11 0.0185000 *
874.559_6.259 rel_abund_log2 b1 b3 12 12 -2.845618 11 0.0159000 *
874.6643_9.99 rel_abund_log2 b1 b3 12 12 -2.701647 11 0.0206000 *
876.5748_6.674 rel_abund_log2 b1 b3 12 12 -2.416498 11 0.0342000 *
878.584_5.681 rel_abund_log2 b1 b3 12 12 -2.518898 11 0.0285000 *
878.5903_7.305 rel_abund_log2 b1 b3 12 12 -5.052135 11 0.0003710 ***
880.5375_7.198 rel_abund_log2 b1 b3 12 12 3.564089 11 0.0044400 **
880.6062_8.517 rel_abund_log2 b1 b3 12 12 -2.745637 11 0.0190000 *
881.5397_7.202 rel_abund_log2 b1 b3 12 12 3.452148 11 0.0054100 **
881.6055_9.023 rel_abund_log2 b1 b3 12 12 3.594388 11 0.0042100 **
882.6209_8.855 rel_abund_log2 b1 b3 12 12 -2.591754 11 0.0251000 *
883.5331_7.753 rel_abund_log2 b1 b3 12 12 -2.973553 11 0.0127000 *
883.6211_9.976 rel_abund_log2 b1 b3 12 12 3.979468 11 0.0021600 **
884.5587_7.554 rel_abund_log2 b1 b3 12 12 -2.240891 11 0.0466000 *
884.5687_8.94 rel_abund_log2 b1 b3 12 12 3.732280 11 0.0033100 **
886.5195_6.961 rel_abund_log2 b1 b3 12 12 2.258508 11 0.0452000 *
886.5331_7.335 rel_abund_log2 b1 b3 12 12 -2.809623 11 0.0170000 *
887.5991_9.03 rel_abund_log2 b1 b3 12 12 7.018997 11 0.0000221 ****
887.599_8.816 rel_abund_log2 b1 b3 12 12 -2.525994 11 0.0282000 *
889.617_9.974 rel_abund_log2 b1 b3 12 12 3.263960 11 0.0075500 **
890.5649_8.939 rel_abund_log2 b1 b3 12 12 3.170605 11 0.0089100 **
896.5624_7.191 rel_abund_log2 b1 b3 12 12 2.864182 11 0.0154000 *
896.6737_10.623 rel_abund_log2 b1 b3 12 12 3.612493 11 0.0040800 **
897.6305_9.024 rel_abund_log2 b1 b3 12 12 3.528349 11 0.0047300 **
904.6171_10.646 rel_abund_log2 b1 b3 12 12 2.787425 11 0.0177000 *
906.5531_8.016 rel_abund_log2 b1 b3 12 12 -2.208504 11 0.0493000 *
909.6366_10.295 rel_abund_log2 b1 b3 12 12 3.494400 11 0.0050200 **
909.6368_9.99 rel_abund_log2 b1 b3 12 12 -3.158108 11 0.0091100 **
911.5645_8.686 rel_abund_log2 b1 b3 12 12 -2.330918 11 0.0398000 *
911.6461_9.397 rel_abund_log2 b1 b3 12 12 -2.856518 11 0.0156000 *
913.6162_9.035 rel_abund_log2 b1 b3 12 12 -2.934788 11 0.0136000 *
913.6613_10.438 rel_abund_log2 b1 b3 12 12 -2.251360 11 0.0458000 *
914.5643_8.457 rel_abund_log2 b1 b3 12 12 -2.333356 11 0.0396000 *
915.6319_9.987 rel_abund_log2 b1 b3 12 12 -2.421769 11 0.0339000 *
915.6327_10.293 rel_abund_log2 b1 b3 12 12 2.703322 11 0.0205000 *
917.5422_7.049 rel_abund_log2 b1 b3 12 12 2.860671 11 0.0155000 *
917.6329_9.989 rel_abund_log2 b1 b3 12 12 -3.975171 11 0.0021800 **
917.633_10.292 rel_abund_log2 b1 b3 12 12 2.658804 11 0.0222000 *
917.6482_10.589 rel_abund_log2 b1 b3 12 12 2.600068 11 0.0247000 *
918.5466_6.408 rel_abund_log2 b1 b3 12 12 -2.353783 11 0.0382000 *
919.2277_0.616 rel_abund_log2 b1 b3 12 12 2.835237 11 0.0162000 *
920.6735_10.31 rel_abund_log2 b1 b3 12 12 -3.161928 11 0.0090500 **
922.5024_7.08 rel_abund_log2 b1 b3 12 12 2.346660 11 0.0387000 *
922.5774_7.695 rel_abund_log2 b1 b3 12 12 -2.605611 11 0.0244000 *
923.646_9.035 rel_abund_log2 b1 b3 12 12 -2.811329 11 0.0169000 *
923.6524_10.353 rel_abund_log2 b1 b3 12 12 -4.250402 11 0.0013600 **
924.5935_8.459 rel_abund_log2 b1 b3 12 12 -2.831952 11 0.0163000 *
925.6617_9.988 rel_abund_log2 b1 b3 12 12 -3.413678 11 0.0057900 **
927.677_10.59 rel_abund_log2 b1 b3 12 12 3.768684 11 0.0031100 **
93.0344_0.646 rel_abund_log2 b1 b3 12 12 2.767441 11 0.0183000 *
931.5514_9.582 rel_abund_log2 b1 b3 12 12 6.307733 11 0.0000577 ****
931.6162_9.992 rel_abund_log2 b1 b3 12 12 -3.439948 11 0.0055300 **
931.6162_9.999 rel_abund_log2 b1 b3 12 12 -3.523352 11 0.0047700 **
933.5855_8.781 rel_abund_log2 b1 b3 12 12 2.206123 11 0.0496000 *
934.5326_7.772 rel_abund_log2 b1 b3 12 12 2.827829 11 0.0164000 *
939.6769_10.335 rel_abund_log2 b1 b3 12 12 -5.349194 11 0.0002340 ***
940.5496_7.764 rel_abund_log2 b1 b3 12 12 2.603873 11 0.0245000 *
942.5548_7.339 rel_abund_log2 b1 b3 12 12 -3.096144 11 0.0102000 *
945.6385_9.975 rel_abund_log2 b1 b3 12 12 5.023253 11 0.0003880 ***
948.5172_7.192 rel_abund_log2 b1 b3 12 12 2.211315 11 0.0491000 *
950.6082_8.859 rel_abund_log2 b1 b3 12 12 -3.697007 11 0.0035200 **
958.5324_7.191 rel_abund_log2 b1 b3 12 12 4.769190 11 0.0005810 ***
959.6018_9.026 rel_abund_log2 b1 b3 12 12 3.011016 11 0.0118000 *
960.7412_11.038 rel_abund_log2 b1 b3 12 12 -5.355291 11 0.0002320 ***
961.6178_9.977 rel_abund_log2 b1 b3 12 12 2.863790 11 0.0154000 *
967.6322_9.976 rel_abund_log2 b1 b3 12 12 3.507409 11 0.0049100 **
968.581_8.937 rel_abund_log2 b1 b3 12 12 2.760953 11 0.0185000 *
969.6384_9.033 rel_abund_log2 b1 b3 12 12 -2.966128 11 0.0128000 *
970.5858_8.459 rel_abund_log2 b1 b3 12 12 -2.377833 11 0.0366000 *
970.6153_10.616 rel_abund_log2 b1 b3 12 12 -3.245496 11 0.0078000 **
971.6542_9.988 rel_abund_log2 b1 b3 12 12 -2.893852 11 0.0146000 *
976.5477_8.457 rel_abund_log2 b1 b3 12 12 -2.850174 11 0.0158000 *
983.6184_9.976 rel_abund_log2 b1 b3 12 12 -3.674388 11 0.0036600 **
983.6185_9.993 rel_abund_log2 b1 b3 12 12 -2.741676 11 0.0192000 *
985.616_9.034 rel_abund_log2 b1 b3 12 12 -2.202084 11 0.0499000 *
986.5637_8.459 rel_abund_log2 b1 b3 12 12 -4.993769 11 0.0004070 ***
987.6318_9.987 rel_abund_log2 b1 b3 12 12 -3.215418 11 0.0082300 **
990.5651_8.013 rel_abund_log2 b1 b3 12 12 -2.503305 11 0.0293000 *
992.5806_8.459 rel_abund_log2 b1 b3 12 12 -4.293004 11 0.0012700 **
993.6488_9.986 rel_abund_log2 b1 b3 12 12 -2.603555 11 0.0245000 *
# how many are significant?
nrow(beta_t.test_paired_sig)
## [1] 311
Remove BG diet
# let's grab both datasets for features sig in pre v post beta and pre v post control and combine them
fulljoin_t.test_betaANDctrl <- full_join(beta_t.test_paired_sig, ctrl_t.test_paired_sig,
                                        by = "mz_rt",
                                        suffix = c(".beta", ".ctrl"))

# number of features in combined list
nrow(fulljoin_t.test_betaANDctrl)
## [1] 389

Let’s try and remove features significant due to the background diet

sig_paired_beta_rmBG <- fulljoin_t.test_betaANDctrl %>%
  # add a column to account for direction
  mutate(sign = statistic.beta * statistic.ctrl) %>%
  # replace NAs in the sign column with 0
  mutate(sign = replace_na(sign, 0)) %>%
  # replace NAs in the statistic.ctrl column to 0
  mutate(statistic.ctrl = replace_na(statistic.ctrl, 0)) %>%
  # filter for columns that are either negative (means ctrl and tomato are going in opposite dir) or where the stat.ctrl col is 0 (so we don't remove features that are just not present in the sig control list)
  filter((sign < 0 | statistic.ctrl == 0))

# number of features without bg diet effect
nrow(sig_paired_beta_rmBG)
## [1] 167

How many BG-diet-related features did we remove from the list of significant beta features?

nrow(beta_t.test_paired_sig) - nrow(sig_paired_beta_rmBG)
## [1] 144
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA. Let’s take our new feature list (background diet effect removed)

# select only features from paired list that have a match in ANOVA list
beta_sig_ANOVA_overlap_paired <- inner_join(sig_paired_beta_rmBG,
                                            trt_tukeyHSD_sig,
                                            by = "mz_rt",
                                            suffix = c(".t-test", ".tukeys"))

# features overlapping with sig ANOVA
unique(beta_sig_ANOVA_overlap_paired$mz_rt)
##  [1] "1561.2028_9.038" "526.3144_2.683"  "674.6039_10.834" "682.6332_10.835"
##  [5] "705.5178_5.308"  "721.549_6"       "764.5798_8.343"  "800.5357_7.469" 
##  [9] "824.5771_8.938"  "847.6455_10.298" "848.5114_9.046"  "853.619_10.659" 
## [13] "857.6749_9.986"  "863.5644_9.582"  "868.5303_7.476"  "887.5991_9.03"  
## [17] "909.6368_9.99"   "915.6327_10.293" "917.6329_9.989"  "940.5496_7.764" 
## [21] "945.6385_9.975"  "969.6384_9.033"  "983.6184_9.976"  "983.6185_9.993" 
## [25] "987.6318_9.987"
Mummichog list

Pulling features that are significant in paired t-test due to treatment, not due to background diet.

paired_beta_for_mummichog <- sig_paired_beta_rmBG %>%
  dplyr::select(mz_rt,
         p.beta,
         statistic.beta) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p.beta") %>%
  rename("t-score" = "statistic.beta")

write_csv(paired_beta_for_mummichog,
          "for mummichog analysis/t-test-res-beta-paired.csv")

Paired red

# run paired t-tests for control intervention
red_t.test_paired <- df_for_stats %>%
  filter(treatment == "red") %>%
 dplyr::select(subject, period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ period, 
         paired = TRUE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
red_t.test_paired_sig <- red_t.test_paired %>%
  filter(p < 0.05)
kable(red_t.test_paired_sig)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
1002.5196_7.769 rel_abund_log2 b1 b3 12 12 5.087474 11 0.0003510 ***
1008.5435_7.813 rel_abund_log2 b1 b3 12 12 -2.484718 11 0.0303000 *
1061.6776_3.089 rel_abund_log2 b1 b3 12 12 2.255507 11 0.0454000 *
1135.6242_2.73 rel_abund_log2 b1 b3 12 12 2.839018 11 0.0161000 *
117.0557_0.669 rel_abund_log2 b1 b3 12 12 3.518094 11 0.0048100 **
1279.8241_10.52 rel_abund_log2 b1 b3 12 12 2.411636 11 0.0345000 *
1334.2417_10.855 rel_abund_log2 b1 b3 12 12 2.677224 11 0.0215000 *
1335.245_10.854 rel_abund_log2 b1 b3 12 12 2.512060 11 0.0289000 *
1554.1226_7.773 rel_abund_log2 b1 b3 12 12 3.891711 11 0.0025100 **
1555.1258_7.773 rel_abund_log2 b1 b3 12 12 2.649203 11 0.0226000 *
1561.2028_9.038 rel_abund_log2 b1 b3 12 12 -4.406847 11 0.0010500 **
1579.1408_6.75 rel_abund_log2 b1 b3 12 12 -2.328366 11 0.0400000 *
1600.0951_6.94 rel_abund_log2 b1 b3 12 12 -2.280807 11 0.0435000 *
1616.1136_7.768 rel_abund_log2 b1 b3 12 12 3.714983 11 0.0034100 **
1632.139_7.776 rel_abund_log2 b1 b3 12 12 3.115819 11 0.0098200 **
1633.1422_7.775 rel_abund_log2 b1 b3 12 12 2.862239 11 0.0155000 *
1654.1535_8.02 rel_abund_log2 b1 b3 12 12 -3.315537 11 0.0068900 **
1655.1569_8.02 rel_abund_log2 b1 b3 12 12 -2.281514 11 0.0434000 *
1666.3553_10.589 rel_abund_log2 b1 b3 12 12 2.272183 11 0.0441000 *
201.0226_0.688 rel_abund_log2 b1 b3 12 12 3.106809 11 0.0099800 **
213.0223_0.689 rel_abund_log2 b1 b3 12 12 -5.881212 11 0.0001060 ***
231.0795_0.662 rel_abund_log2 b1 b3 12 12 2.314161 11 0.0410000 *
239.0923_0.975 rel_abund_log2 b1 b3 12 12 4.170083 11 0.0015600 **
279.2327_4.208 rel_abund_log2 b1 b3 12 12 -2.327239 11 0.0401000 *
311.2224_2.465 rel_abund_log2 b1 b3 12 12 3.592636 11 0.0042200 **
316.9477_0.518 rel_abund_log2 b1 b3 12 12 -2.644557 11 0.0228000 *
343.9948_0.639 rel_abund_log2 b1 b3 12 12 -2.386287 11 0.0361000 *
352.0856_0.687 rel_abund_log2 b1 b3 12 12 -3.710290 11 0.0034400 **
397.3681_5 rel_abund_log2 b1 b3 12 12 2.343181 11 0.0390000 *
411.3837_5.349 rel_abund_log2 b1 b3 12 12 4.978168 11 0.0004170 ***
413.1998_0.688 rel_abund_log2 b1 b3 12 12 2.742834 11 0.0191000 *
437.0542_0.688 rel_abund_log2 b1 b3 12 12 -2.526373 11 0.0282000 *
441.3942_4.718 rel_abund_log2 b1 b3 12 12 3.948416 11 0.0022800 **
444.0682_4.208 rel_abund_log2 b1 b3 12 12 -2.387538 11 0.0360000 *
447.3471_4.631 rel_abund_log2 b1 b3 12 12 2.917431 11 0.0140000 *
462.1763_0.655 rel_abund_log2 b1 b3 12 12 -3.921660 11 0.0023900 **
478.2933_3.354 rel_abund_log2 b1 b3 12 12 3.510513 11 0.0048800 **
491.3733_4.784 rel_abund_log2 b1 b3 12 12 2.573233 11 0.0259000 *
493.3349_5.699 rel_abund_log2 b1 b3 12 12 -2.437924 11 0.0329000 *
504.3089_2.726 rel_abund_log2 b1 b3 12 12 2.726291 11 0.0197000 *
506.3245_3.232 rel_abund_log2 b1 b3 12 12 2.764072 11 0.0184000 *
507.223_1.7 rel_abund_log2 b1 b3 12 12 -6.642237 11 0.0000365 ****
507.223_2.273 rel_abund_log2 b1 b3 12 12 -5.376197 11 0.0002250 ***
538.3144_2.488 rel_abund_log2 b1 b3 12 12 2.752197 11 0.0188000 *
539.4309_4.416 rel_abund_log2 b1 b3 12 12 2.738945 11 0.0193000 *
551.3582_4.841 rel_abund_log2 b1 b3 12 12 -5.655791 11 0.0001480 ***
557.4566_6.309 rel_abund_log2 b1 b3 12 12 4.960029 11 0.0004290 ***
557.457_6.865 rel_abund_log2 b1 b3 12 12 5.928513 11 0.0000989 ****
558.3148_3.234 rel_abund_log2 b1 b3 12 12 2.722424 11 0.0198000 *
559.4719_6.867 rel_abund_log2 b1 b3 12 12 4.504786 11 0.0008940 ***
561.2272_6.889 rel_abund_log2 b1 b3 12 12 4.524246 11 0.0008660 ***
566.3462_3.232 rel_abund_log2 b1 b3 12 12 3.698232 11 0.0035100 **
567.4621_4.643 rel_abund_log2 b1 b3 12 12 4.258499 11 0.0013500 **
573.4515_4.266 rel_abund_log2 b1 b3 12 12 3.883000 11 0.0025500 **
573.4515_4.873 rel_abund_log2 b1 b3 12 12 4.950609 11 0.0004350 ***
575.4672_5.354 rel_abund_log2 b1 b3 12 12 5.966417 11 0.0000937 ****
575.467_4.662 rel_abund_log2 b1 b3 12 12 4.324484 11 0.0012100 **
577.3738_4.918 rel_abund_log2 b1 b3 12 12 -4.802641 11 0.0005510 ***
579.3893_5.557 rel_abund_log2 b1 b3 12 12 -4.522476 11 0.0008690 ***
586.3143_2.221 rel_abund_log2 b1 b3 12 12 2.296927 11 0.0423000 *
591.3894_5.174 rel_abund_log2 b1 b3 12 12 -2.279564 11 0.0436000 *
591.462_4.314 rel_abund_log2 b1 b3 12 12 4.996007 11 0.0004050 ***
591.462_4.651 rel_abund_log2 b1 b3 12 12 4.759642 11 0.0005900 ***
593.4778_4.664 rel_abund_log2 b1 b3 12 12 6.664055 11 0.0000354 ****
594.3768_3.858 rel_abund_log2 b1 b3 12 12 2.493352 11 0.0299000 *
595.4933_4.953 rel_abund_log2 b1 b3 12 12 8.808419 11 0.0000026 ****
605.1555_0.616 rel_abund_log2 b1 b3 12 12 2.914407 11 0.0141000 *
618.308_3.232 rel_abund_log2 b1 b3 12 12 2.368440 11 0.0373000 *
624.3379_0.689 rel_abund_log2 b1 b3 12 12 -3.822007 11 0.0028300 **
624.3382_0.91 rel_abund_log2 b1 b3 12 12 -2.731510 11 0.0195000 *
630.5417_10.49 rel_abund_log2 b1 b3 12 12 2.427459 11 0.0336000 *
634.3329_3.232 rel_abund_log2 b1 b3 12 12 4.244903 11 0.0013800 **
652.5879_10.611 rel_abund_log2 b1 b3 12 12 2.216051 11 0.0487000 *
653.491_10.071 rel_abund_log2 b1 b3 12 12 -2.500840 11 0.0295000 *
658.0669_0.628 rel_abund_log2 b1 b3 12 12 2.586947 11 0.0253000 *
676.6243_10.731 rel_abund_log2 b1 b3 12 12 -4.997688 11 0.0004040 ***
680.5744_10.545 rel_abund_log2 b1 b3 12 12 -2.790812 11 0.0176000 *
682.5753_10.545 rel_abund_log2 b1 b3 12 12 -3.394082 11 0.0059900 **
684.6065_10.853 rel_abund_log2 b1 b3 12 12 2.741460 11 0.0192000 *
690.603_10.546 rel_abund_log2 b1 b3 12 12 -2.866297 11 0.0153000 *
696.3033_3.233 rel_abund_log2 b1 b3 12 12 3.120607 11 0.0097400 **
696.6064_10.749 rel_abund_log2 b1 b3 12 12 -4.216071 11 0.0014500 **
720.4962_7.178 rel_abund_log2 b1 b3 12 12 2.222434 11 0.0482000 *
736.5275_8.432 rel_abund_log2 b1 b3 12 12 -3.108040 11 0.0099600 **
746.5966_10.853 rel_abund_log2 b1 b3 12 12 2.532297 11 0.0279000 *
750.5436_9.042 rel_abund_log2 b1 b3 12 12 -2.428826 11 0.0335000 *
759.5646_6.287 rel_abund_log2 b1 b3 12 12 -3.359414 11 0.0063700 **
763.5516_6.749 rel_abund_log2 b1 b3 12 12 -2.605778 11 0.0244000 *
764.5798_8.343 rel_abund_log2 b1 b3 12 12 -2.697964 11 0.0207000 *
766.5385_8.385 rel_abund_log2 b1 b3 12 12 -2.278484 11 0.0437000 *
773.5806_6.749 rel_abund_log2 b1 b3 12 12 -4.202953 11 0.0014800 **
776.5438_6.762 rel_abund_log2 b1 b3 12 12 2.234046 11 0.0472000 *
780.4705_7.867 rel_abund_log2 b1 b3 12 12 -2.371311 11 0.0371000 *
786.5646_7.575 rel_abund_log2 b1 b3 12 12 -2.674363 11 0.0216000 *
789.6114_7.911 rel_abund_log2 b1 b3 12 12 -2.894935 11 0.0146000 *
790.5382_8.16 rel_abund_log2 b1 b3 12 12 -2.710232 11 0.0203000 *
790.5593_7.252 rel_abund_log2 b1 b3 12 12 2.392407 11 0.0357000 *
793.5985_8.765 rel_abund_log2 b1 b3 12 12 4.083592 11 0.0018100 **
794.5298_7.047 rel_abund_log2 b1 b3 12 12 2.470229 11 0.0311000 *
794.5464_7.772 rel_abund_log2 b1 b3 12 12 4.425982 11 0.0010200 **
795.5979_8.768 rel_abund_log2 b1 b3 12 12 2.910540 11 0.0142000 *
796.5458_7.771 rel_abund_log2 b1 b3 12 12 3.334957 11 0.0066500 **
800.5357_7.469 rel_abund_log2 b1 b3 12 12 -2.935130 11 0.0136000 *
803.6275_8.771 rel_abund_log2 b1 b3 12 12 2.380422 11 0.0365000 *
804.5762_7.774 rel_abund_log2 b1 b3 12 12 4.761839 11 0.0005880 ***
804.6308_8.768 rel_abund_log2 b1 b3 12 12 2.708314 11 0.0204000 *
806.5463_7.553 rel_abund_log2 b1 b3 12 12 -2.657083 11 0.0223000 *
810.5642_6.968 rel_abund_log2 b1 b3 12 12 2.864907 11 0.0154000 *
810.5647_7.467 rel_abund_log2 b1 b3 12 12 -6.036476 11 0.0000847 ****
812.5436_6.468 rel_abund_log2 b1 b3 12 12 -2.288893 11 0.0429000 *
812.58_7.898 rel_abund_log2 b1 b3 12 12 -2.972847 11 0.0127000 *
815.627_8.417 rel_abund_log2 b1 b3 12 12 -2.539421 11 0.0275000 *
818.6271_10.414 rel_abund_log2 b1 b3 12 12 2.627604 11 0.0235000 *
819.6141_8.816 rel_abund_log2 b1 b3 12 12 -2.470010 11 0.0311000 *
819.6141_9.024 rel_abund_log2 b1 b3 12 12 2.336529 11 0.0394000 *
820.4801_7.866 rel_abund_log2 b1 b3 12 12 -2.958164 11 0.0130000 *
821.6139_9.026 rel_abund_log2 b1 b3 12 12 3.130582 11 0.0095700 **
822.5774_8.941 rel_abund_log2 b1 b3 12 12 3.223471 11 0.0081100 **
824.5771_8.938 rel_abund_log2 b1 b3 12 12 2.959486 11 0.0130000 *
824.5789_7.841 rel_abund_log2 b1 b3 12 12 -5.511575 11 0.0001830 ***
827.6272_7.905 rel_abund_log2 b1 b3 12 12 -6.458125 11 0.0000469 ****
828.6559_10.414 rel_abund_log2 b1 b3 12 12 2.674948 11 0.0216000 *
829.6431_8.816 rel_abund_log2 b1 b3 12 12 -2.604246 11 0.0245000 *
829.6432_9.024 rel_abund_log2 b1 b3 12 12 2.546679 11 0.0272000 *
830.5815_7.188 rel_abund_log2 b1 b3 12 12 2.286961 11 0.0430000 *
831.6576_9.28 rel_abund_log2 b1 b3 12 12 -3.683310 11 0.0036000 **
831.659_9.98 rel_abund_log2 b1 b3 12 12 2.594857 11 0.0249000 *
832.6067_8.94 rel_abund_log2 b1 b3 12 12 2.286437 11 0.0430000 *
833.6294_9.395 rel_abund_log2 b1 b3 12 12 -3.469274 11 0.0052500 **
834.5643_7.242 rel_abund_log2 b1 b3 12 12 -3.396780 11 0.0059600 **
835.5322_8.336 rel_abund_log2 b1 b3 12 12 3.912013 11 0.0024300 **
836.5799_7.605 rel_abund_log2 b1 b3 12 12 -3.290278 11 0.0072000 **
838.5955_8.279 rel_abund_log2 b1 b3 12 12 -3.243569 11 0.0078200 **
838.5956_7.75 rel_abund_log2 b1 b3 12 12 -2.958585 11 0.0130000 *
838.5956_8.612 rel_abund_log2 b1 b3 12 12 -2.589499 11 0.0252000 *
840.5304_6.407 rel_abund_log2 b1 b3 12 12 -2.607587 11 0.0244000 *
840.5749_7.321 rel_abund_log2 b1 b3 12 12 -2.328660 11 0.0400000 *
840.5749_7.471 rel_abund_log2 b1 b3 12 12 -3.952872 11 0.0022600 **
840.6112_8.445 rel_abund_log2 b1 b3 12 12 -2.665196 11 0.0220000 *
841.5661_6.75 rel_abund_log2 b1 b3 12 12 -2.798294 11 0.0173000 *
841.6406_8.452 rel_abund_log2 b1 b3 12 12 -4.142839 11 0.0016400 **
842.5905_7.891 rel_abund_log2 b1 b3 12 12 -2.893307 11 0.0146000 *
843.5493_6.926 rel_abund_log2 b1 b3 12 12 -2.532832 11 0.0278000 *
843.6586_9.396 rel_abund_log2 b1 b3 12 12 -4.632265 11 0.0007260 ***
844.562_8.02 rel_abund_log2 b1 b3 12 12 -2.899062 11 0.0145000 *
846.5617_8.018 rel_abund_log2 b1 b3 12 12 -2.362157 11 0.0377000 *
851.6615_10.59 rel_abund_log2 b1 b3 12 12 2.365918 11 0.0374000 *
853.619_10.659 rel_abund_log2 b1 b3 12 12 -2.959340 11 0.0130000 *
853.6428_8.12 rel_abund_log2 b1 b3 12 12 -5.439360 11 0.0002040 ***
854.5519_7.576 rel_abund_log2 b1 b3 12 12 -2.759487 11 0.0186000 *
854.5918_8.021 rel_abund_log2 b1 b3 12 12 -2.640217 11 0.0230000 *
854.6714_10.418 rel_abund_log2 b1 b3 12 12 -2.934783 11 0.0136000 *
855.59_8.755 rel_abund_log2 b1 b3 12 12 2.782645 11 0.0178000 *
855.6591_9.033 rel_abund_log2 b1 b3 12 12 -3.370710 11 0.0062400 **
856.5377_7.769 rel_abund_log2 b1 b3 12 12 2.819373 11 0.0167000 *
857.6737_9.513 rel_abund_log2 b1 b3 12 12 -4.017278 11 0.0020300 **
857.6749_9.986 rel_abund_log2 b1 b3 12 12 -2.519018 11 0.0285000 *
859.6907_10.59 rel_abund_log2 b1 b3 12 12 2.507800 11 0.0291000 *
860.6919_10.384 rel_abund_log2 b1 b3 12 12 -2.220171 11 0.0484000 *
862.5261_7.47 rel_abund_log2 b1 b3 12 12 -2.442545 11 0.0327000 *
862.527_7.471 rel_abund_log2 b1 b3 12 12 -3.581277 11 0.0043100 **
862.5335_7.761 rel_abund_log2 b1 b3 12 12 3.484913 11 0.0051000 **
862.6535_10.583 rel_abund_log2 b1 b3 12 12 2.461363 11 0.0316000 *
863.5644_9.582 rel_abund_log2 b1 b3 12 12 4.513263 11 0.0008820 ***
864.5747_7.263 rel_abund_log2 b1 b3 12 12 -4.194692 11 0.0015000 **
867.5493_6.755 rel_abund_log2 b1 b3 12 12 -3.270510 11 0.0074600 **
868.5303_7.476 rel_abund_log2 b1 b3 12 12 -5.161248 11 0.0003130 ***
870.5618_7.814 rel_abund_log2 b1 b3 12 12 -2.517540 11 0.0286000 *
871.6147_8.768 rel_abund_log2 b1 b3 12 12 2.998878 11 0.0121000 *
871.6891_10.337 rel_abund_log2 b1 b3 12 12 -6.058263 11 0.0000821 ****
872.5626_7.769 rel_abund_log2 b1 b3 12 12 4.662368 11 0.0006910 ***
872.6815_10.583 rel_abund_log2 b1 b3 12 12 2.303731 11 0.0418000 *
878.5903_7.305 rel_abund_log2 b1 b3 12 12 -2.993849 11 0.0122000 *
878.5909_7.805 rel_abund_log2 b1 b3 12 12 -3.196243 11 0.0085100 **
880.5669_7.637 rel_abund_log2 b1 b3 12 12 -2.649512 11 0.0226000 *
880.6062_8.517 rel_abund_log2 b1 b3 12 12 -2.497099 11 0.0297000 *
881.6055_9.023 rel_abund_log2 b1 b3 12 12 2.446621 11 0.0324000 *
882.6209_8.855 rel_abund_log2 b1 b3 12 12 -2.384586 11 0.0362000 *
883.5565_8.118 rel_abund_log2 b1 b3 12 12 3.119995 11 0.0097500 **
883.6211_9.976 rel_abund_log2 b1 b3 12 12 2.980937 11 0.0125000 *
884.5687_8.94 rel_abund_log2 b1 b3 12 12 2.947014 11 0.0133000 *
887.5646_9.463 rel_abund_log2 b1 b3 12 12 2.692579 11 0.0209000 *
887.5991_9.03 rel_abund_log2 b1 b3 12 12 3.089693 11 0.0103000 *
888.5362_7.768 rel_abund_log2 b1 b3 12 12 3.724193 11 0.0033600 **
894.658_10.086 rel_abund_log2 b1 b3 12 12 -2.874958 11 0.0151000 *
905.6039_10.298 rel_abund_log2 b1 b3 12 12 2.489882 11 0.0300000 *
906.5828_8.614 rel_abund_log2 b1 b3 12 12 -2.212480 11 0.0490000 *
909.6368_9.99 rel_abund_log2 b1 b3 12 12 -2.678270 11 0.0215000 *
911.6461_9.397 rel_abund_log2 b1 b3 12 12 -3.091993 11 0.0102000 *
914.6592_10.621 rel_abund_log2 b1 b3 12 12 -2.615078 11 0.0240000 *
915.6327_10.293 rel_abund_log2 b1 b3 12 12 2.804097 11 0.0171000 *
918.5543_7.768 rel_abund_log2 b1 b3 12 12 4.563219 11 0.0008120 ***
918.5546_7.77 rel_abund_log2 b1 b3 12 12 5.609386 11 0.0001580 ***
919.2277_0.616 rel_abund_log2 b1 b3 12 12 2.779683 11 0.0179000 *
919.6483_10.59 rel_abund_log2 b1 b3 12 12 2.490412 11 0.0300000 *
920.6735_10.31 rel_abund_log2 b1 b3 12 12 -5.883455 11 0.0001060 ***
922.5781_8.016 rel_abund_log2 b1 b3 12 12 -3.273357 11 0.0074200 **
922.6891_10.613 rel_abund_log2 b1 b3 12 12 -2.865719 11 0.0154000 *
923.646_9.035 rel_abund_log2 b1 b3 12 12 -3.004914 11 0.0120000 *
923.6524_10.353 rel_abund_log2 b1 b3 12 12 -4.830168 11 0.0005270 ***
925.6617_9.988 rel_abund_log2 b1 b3 12 12 -2.595588 11 0.0249000 *
930.5504_7.815 rel_abund_log2 b1 b3 12 12 -3.151413 11 0.0092200 **
931.5514_9.582 rel_abund_log2 b1 b3 12 12 3.949634 11 0.0022700 **
938.5513_8.018 rel_abund_log2 b1 b3 12 12 -2.411316 11 0.0345000 *
939.6769_10.335 rel_abund_log2 b1 b3 12 12 -3.723151 11 0.0033600 **
940.5496_7.764 rel_abund_log2 b1 b3 12 12 2.698203 11 0.0207000 *
945.6385_9.975 rel_abund_log2 b1 b3 12 12 2.334111 11 0.0396000 *
959.6018_9.026 rel_abund_log2 b1 b3 12 12 2.230706 11 0.0475000 *
967.6322_9.976 rel_abund_log2 b1 b3 12 12 2.648209 11 0.0227000 *
968.581_8.937 rel_abund_log2 b1 b3 12 12 2.602143 11 0.0246000 *
971.6542_9.988 rel_abund_log2 b1 b3 12 12 -3.216284 11 0.0082100 **
983.6184_9.976 rel_abund_log2 b1 b3 12 12 -2.773685 11 0.0181000 *
983.6185_9.993 rel_abund_log2 b1 b3 12 12 -2.688211 11 0.0211000 *
984.5483_8.018 rel_abund_log2 b1 b3 12 12 -2.450959 11 0.0322000 *
985.616_9.034 rel_abund_log2 b1 b3 12 12 -2.314878 11 0.0409000 *
993.6487_10.29 rel_abund_log2 b1 b3 12 12 3.001124 11 0.0121000 *
993.6488_9.986 rel_abund_log2 b1 b3 12 12 -3.060578 11 0.0108000 *
# how many are significant?
nrow(red_t.test_paired_sig)
## [1] 217
Remove BG diet
# let's grab both datasets for features sig in pre v post red and pre v post control and combine them
fulljoin_t.test_redANDctrl <- full_join(red_t.test_paired_sig, ctrl_t.test_paired_sig,
                                        by = "mz_rt",
                                        suffix = c(".red", ".ctrl"))

# number of features in combined list
nrow(fulljoin_t.test_redANDctrl)
## [1] 317

Let’s try and remove features significant due to the background diet

sig_paired_red_rmBG <- fulljoin_t.test_redANDctrl %>%
  # add a column to account for direction
  mutate(sign = statistic.red * statistic.ctrl) %>%
  # replace NAs in the sign column with 0
  mutate(sign = replace_na(sign, 0)) %>%
  # replace NAs in the statistic.ctrl column to 0
  mutate(statistic.ctrl = replace_na(statistic.ctrl, 0)) %>%
  # filter for columns that are either negative (means ctrl and tomato are going in opposite dir) or where the stat.ctrl col is 0 (so we don't remove features that are just not present in the sig control list)
  filter((sign < 0 | statistic.ctrl == 0))

# number of features without bg diet effect
nrow(sig_paired_red_rmBG)
## [1] 95

How many BG-diet-related features did we remove from the list of significant beta features?

nrow(red_t.test_paired_sig) - nrow(sig_paired_red_rmBG)
## [1] 122
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA. Let’s take our new feature list (background diet effect removed)

# select only features from paired list that have a match in ANOVA list
red_sig_ANOVA_overlap_paired <- inner_join(sig_paired_red_rmBG,
                                            trt_tukeyHSD_sig,
                                            by = "mz_rt",
                                            suffix = c(".t-test", ".tukeys"))

# features overlapping with sig ANOVA
unique(red_sig_ANOVA_overlap_paired$mz_rt)
##  [1] "1002.5196_7.769" "1561.2028_9.038" "561.2272_6.889"  "736.5275_8.432" 
##  [5] "764.5798_8.343"  "800.5357_7.469"  "824.5771_8.938"  "853.619_10.659" 
##  [9] "857.6749_9.986"  "862.5335_7.761"  "863.5644_9.582"  "868.5303_7.476" 
## [13] "887.5991_9.03"   "909.6368_9.99"   "915.6327_10.293" "940.5496_7.764" 
## [17] "945.6385_9.975"  "983.6184_9.976"  "983.6185_9.993"
Mummichog list

Pulling features that are significant in paired t-test due to treatment, not due to background diet.

paired_red_for_mummichog <- sig_paired_red_rmBG %>%
  dplyr::select(mz_rt,
         p.red,
         statistic.red) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p.red") %>%
  rename("t-score" = "statistic.red")

write_csv(paired_red_for_mummichog,
          "for mummichog analysis/t-test-res-red-paired.csv")

Paired tomato

# run paired t-tests for control intervention
tomato_t.test_paired <- df_for_stats %>%
  filter(tomato_or_control == "tomato") %>%
 dplyr::select(subject, period, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ period, 
         paired = TRUE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
tomato_t.test_paired_sig <- tomato_t.test_paired %>%
  filter(p < 0.05)
kable(tomato_t.test_paired_sig)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
1002.5196_7.769 rel_abund_log2 b1 b3 24 24 4.363569 23 0.0002270 ***
1008.5435_7.813 rel_abund_log2 b1 b3 24 24 -2.718844 23 0.0122000 *
1016.7241_9.858 rel_abund_log2 b1 b3 24 24 2.324759 23 0.0293000 *
103.04_0.651 rel_abund_log2 b1 b3 24 24 2.612068 23 0.0156000 *
1061.6776_3.089 rel_abund_log2 b1 b3 24 24 2.500347 23 0.0200000 *
1135.6242_2.73 rel_abund_log2 b1 b3 24 24 2.252609 23 0.0341000 *
117.0557_0.669 rel_abund_log2 b1 b3 24 24 4.301816 23 0.0002650 ***
1235.798_10.088 rel_abund_log2 b1 b3 24 24 3.621783 23 0.0014300 **
1261.8136_10.084 rel_abund_log2 b1 b3 24 24 -2.623333 23 0.0152000 *
1263.8295_10.575 rel_abund_log2 b1 b3 24 24 2.387722 23 0.0256000 *
1279.8241_10.52 rel_abund_log2 b1 b3 24 24 3.745093 23 0.0010600 **
1334.2417_10.855 rel_abund_log2 b1 b3 24 24 3.785577 23 0.0009570 ***
1335.245_10.854 rel_abund_log2 b1 b3 24 24 4.241285 23 0.0003090 ***
1554.1226_7.773 rel_abund_log2 b1 b3 24 24 4.382053 23 0.0002170 ***
1555.1258_7.773 rel_abund_log2 b1 b3 24 24 3.206343 23 0.0039200 **
1558.1192_8.016 rel_abund_log2 b1 b3 24 24 -2.354922 23 0.0274000 *
1561.2028_9.038 rel_abund_log2 b1 b3 24 24 -5.762764 23 0.0000072 ****
1579.1408_6.75 rel_abund_log2 b1 b3 24 24 -3.006221 23 0.0063000 **
1584.1204_6.981 rel_abund_log2 b1 b3 24 24 -2.145271 23 0.0427000 *
1585.1238_6.981 rel_abund_log2 b1 b3 24 24 -2.143270 23 0.0429000 *
1598.0913_6.94 rel_abund_log2 b1 b3 24 24 -2.422202 23 0.0237000 *
1598.1714_7.758 rel_abund_log2 b1 b3 24 24 2.904506 23 0.0079900 **
1599.0952_6.94 rel_abund_log2 b1 b3 24 24 -2.215507 23 0.0369000 *
1600.0951_6.94 rel_abund_log2 b1 b3 24 24 -2.689580 23 0.0131000 *
1602.1228_7.339 rel_abund_log2 b1 b3 24 24 -2.403199 23 0.0247000 *
1612.1504_7.187 rel_abund_log2 b1 b3 24 24 2.617357 23 0.0154000 *
1616.1136_7.768 rel_abund_log2 b1 b3 24 24 4.301321 23 0.0002660 ***
1632.139_7.776 rel_abund_log2 b1 b3 24 24 3.622438 23 0.0014300 **
1633.1422_7.775 rel_abund_log2 b1 b3 24 24 4.522504 23 0.0001530 ***
1654.1535_8.02 rel_abund_log2 b1 b3 24 24 -2.929780 23 0.0075300 **
1655.1569_8.02 rel_abund_log2 b1 b3 24 24 -3.281654 23 0.0032700 **
1664.3521_10.59 rel_abund_log2 b1 b3 24 24 4.040890 23 0.0005080 ***
1665.3553_10.589 rel_abund_log2 b1 b3 24 24 3.286385 23 0.0032300 **
1666.3553_10.589 rel_abund_log2 b1 b3 24 24 3.182997 23 0.0041400 **
1669.2155_8.46 rel_abund_log2 b1 b3 24 24 -2.172830 23 0.0403000 *
1670.349_9.987 rel_abund_log2 b1 b3 24 24 -3.026759 23 0.0060000 **
1674.3803_10.59 rel_abund_log2 b1 b3 24 24 3.712049 23 0.0011500 **
1675.384_10.589 rel_abund_log2 b1 b3 24 24 3.620181 23 0.0014400 **
1685.1732_8.11 rel_abund_log2 b1 b3 24 24 2.101121 23 0.0468000 *
172.9913_0.642 rel_abund_log2 b1 b3 24 24 3.198641 23 0.0039900 **
188.9862_0.644 rel_abund_log2 b1 b3 24 24 -3.065903 23 0.0054700 **
201.0226_0.688 rel_abund_log2 b1 b3 24 24 3.998360 23 0.0005650 ***
201.0575_0.644 rel_abund_log2 b1 b3 24 24 2.171078 23 0.0405000 *
213.0223_0.689 rel_abund_log2 b1 b3 24 24 -2.881431 23 0.0084300 **
226.9658_0.499 rel_abund_log2 b1 b3 24 24 -2.307105 23 0.0304000 *
229.0537_0.703 rel_abund_log2 b1 b3 24 24 -2.223511 23 0.0363000 *
230.9967_0.644 rel_abund_log2 b1 b3 24 24 -2.398109 23 0.0250000 *
239.0923_0.975 rel_abund_log2 b1 b3 24 24 2.249157 23 0.0344000 *
244.908_0.706 rel_abund_log2 b1 b3 24 24 -3.051810 23 0.0056600 **
311.2224_2.465 rel_abund_log2 b1 b3 24 24 3.457428 23 0.0021400 **
316.9477_0.518 rel_abund_log2 b1 b3 24 24 -2.481219 23 0.0208000 *
343.9948_0.639 rel_abund_log2 b1 b3 24 24 -2.534062 23 0.0185000 *
352.0856_0.687 rel_abund_log2 b1 b3 24 24 -5.668731 23 0.0000090 ****
397.3681_5 rel_abund_log2 b1 b3 24 24 4.364590 23 0.0002270 ***
411.3837_5.349 rel_abund_log2 b1 b3 24 24 8.048607 23 0.0000000 ****
413.1998_0.688 rel_abund_log2 b1 b3 24 24 2.312217 23 0.0301000 *
436.2827_3.522 rel_abund_log2 b1 b3 24 24 -3.158151 23 0.0044000 **
437.0542_0.688 rel_abund_log2 b1 b3 24 24 -4.140244 23 0.0003970 ***
441.3942_4.718 rel_abund_log2 b1 b3 24 24 5.755661 23 0.0000073 ****
447.3471_4.631 rel_abund_log2 b1 b3 24 24 2.640290 23 0.0146000 *
449.3627_4.663 rel_abund_log2 b1 b3 24 24 2.657712 23 0.0141000 *
462.1763_0.655 rel_abund_log2 b1 b3 24 24 -6.698636 23 0.0000008 ****
467.3735_4.306 rel_abund_log2 b1 b3 24 24 2.465112 23 0.0216000 *
476.2777_2.847 rel_abund_log2 b1 b3 24 24 2.596805 23 0.0161000 *
478.2933_3.354 rel_abund_log2 b1 b3 24 24 5.056524 23 0.0000405 ****
504.3089_2.726 rel_abund_log2 b1 b3 24 24 3.204509 23 0.0039400 **
506.3245_3.232 rel_abund_log2 b1 b3 24 24 3.574233 23 0.0016100 **
507.223_1.7 rel_abund_log2 b1 b3 24 24 -11.228326 23 0.0000000 ****
507.223_2.273 rel_abund_log2 b1 b3 24 24 -9.093738 23 0.0000000 ****
511.3997_4.453 rel_abund_log2 b1 b3 24 24 2.746641 23 0.0115000 *
517.2436_2.68 rel_abund_log2 b1 b3 24 24 2.524262 23 0.0190000 *
519.347_6.861 rel_abund_log2 b1 b3 24 24 2.216985 23 0.0368000 *
524.3351_3.376 rel_abund_log2 b1 b3 24 24 -2.734986 23 0.0118000 *
526.3144_2.683 rel_abund_log2 b1 b3 24 24 -2.997438 23 0.0064300 **
528.2631_0.691 rel_abund_log2 b1 b3 24 24 2.972412 23 0.0068200 **
537.4153_4.24 rel_abund_log2 b1 b3 24 24 2.795157 23 0.0103000 *
539.4309_4.416 rel_abund_log2 b1 b3 24 24 3.598005 23 0.0015200 **
551.3582_4.841 rel_abund_log2 b1 b3 24 24 -9.941869 23 0.0000000 ****
554.3456_3.441 rel_abund_log2 b1 b3 24 24 -3.608189 23 0.0014800 **
556.299_2.728 rel_abund_log2 b1 b3 24 24 2.192282 23 0.0387000 *
557.4566_6.309 rel_abund_log2 b1 b3 24 24 4.515541 23 0.0001560 ***
557.457_6.865 rel_abund_log2 b1 b3 24 24 3.545420 23 0.0017300 **
558.3148_3.234 rel_abund_log2 b1 b3 24 24 3.885466 23 0.0007470 ***
559.4719_6.867 rel_abund_log2 b1 b3 24 24 6.625960 23 0.0000009 ****
560.2269_6.891 rel_abund_log2 b1 b3 24 24 -2.847245 23 0.0091200 **
564.3308_2.727 rel_abund_log2 b1 b3 24 24 2.162660 23 0.0412000 *
566.3462_3.232 rel_abund_log2 b1 b3 24 24 4.767304 23 0.0000831 ****
567.4621_4.643 rel_abund_log2 b1 b3 24 24 6.042322 23 0.0000037 ****
573.4515_4.266 rel_abund_log2 b1 b3 24 24 6.048715 23 0.0000036 ****
573.4515_4.873 rel_abund_log2 b1 b3 24 24 4.490611 23 0.0001660 ***
575.4672_5.354 rel_abund_log2 b1 b3 24 24 7.374904 23 0.0000002 ****
575.467_4.662 rel_abund_log2 b1 b3 24 24 6.917587 23 0.0000005 ****
577.3738_4.918 rel_abund_log2 b1 b3 24 24 -9.700780 23 0.0000000 ****
579.3893_5.557 rel_abund_log2 b1 b3 24 24 -8.857138 23 0.0000000 ****
583.1735_0.618 rel_abund_log2 b1 b3 24 24 2.308349 23 0.0303000 *
591.3894_5.174 rel_abund_log2 b1 b3 24 24 -5.036246 23 0.0000426 ****
591.462_4.314 rel_abund_log2 b1 b3 24 24 4.970156 23 0.0000502 ****
591.462_4.651 rel_abund_log2 b1 b3 24 24 6.404172 23 0.0000016 ****
593.4778_4.664 rel_abund_log2 b1 b3 24 24 8.493080 23 0.0000000 ****
594.3768_3.858 rel_abund_log2 b1 b3 24 24 3.620389 23 0.0014400 **
595.4933_4.953 rel_abund_log2 b1 b3 24 24 14.557359 23 0.0000000 ****
600.5119_9.48 rel_abund_log2 b1 b3 24 24 -2.683104 23 0.0133000 *
605.1555_0.616 rel_abund_log2 b1 b3 24 24 4.092346 23 0.0004470 ***
618.308_3.232 rel_abund_log2 b1 b3 24 24 3.341788 23 0.0028300 **
619.2886_2.757 rel_abund_log2 b1 b3 24 24 2.243276 23 0.0348000 *
624.3379_0.689 rel_abund_log2 b1 b3 24 24 -4.761801 23 0.0000843 ****
624.3382_0.91 rel_abund_log2 b1 b3 24 24 -2.332559 23 0.0288000 *
630.5417_10.49 rel_abund_log2 b1 b3 24 24 2.228670 23 0.0359000 *
632.3174_2.729 rel_abund_log2 b1 b3 24 24 2.142473 23 0.0430000 *
634.3329_3.232 rel_abund_log2 b1 b3 24 24 4.891200 23 0.0000611 ****
640.5796_10.729 rel_abund_log2 b1 b3 24 24 -3.143170 23 0.0045600 **
643.1067_0.611 rel_abund_log2 b1 b3 24 24 2.161843 23 0.0413000 *
653.491_10.071 rel_abund_log2 b1 b3 24 24 -2.405533 23 0.0246000 *
654.5589_10.54 rel_abund_log2 b1 b3 24 24 2.211313 23 0.0372000 *
656.5586_10.54 rel_abund_log2 b1 b3 24 24 2.415822 23 0.0240000 *
656.575_10.694 rel_abund_log2 b1 b3 24 24 3.219790 23 0.0037900 **
658.0669_0.628 rel_abund_log2 b1 b3 24 24 2.725567 23 0.0121000 *
664.5877_10.541 rel_abund_log2 b1 b3 24 24 3.142568 23 0.0045600 **
674.6039_10.834 rel_abund_log2 b1 b3 24 24 -4.290434 23 0.0002730 ***
676.6243_10.731 rel_abund_log2 b1 b3 24 24 -6.593231 23 0.0000010 ****
678.6402_10.885 rel_abund_log2 b1 b3 24 24 -3.188411 23 0.0040900 **
680.0486_0.63 rel_abund_log2 b1 b3 24 24 -2.070573 23 0.0498000 *
680.5744_10.545 rel_abund_log2 b1 b3 24 24 -3.160390 23 0.0043700 **
682.5753_10.545 rel_abund_log2 b1 b3 24 24 -2.901487 23 0.0080400 **
682.6332_10.835 rel_abund_log2 b1 b3 24 24 -3.875103 23 0.0007670 ***
684.6065_10.853 rel_abund_log2 b1 b3 24 24 4.358717 23 0.0002300 ***
690.603_10.546 rel_abund_log2 b1 b3 24 24 -3.129321 23 0.0047100 **
696.3033_3.233 rel_abund_log2 b1 b3 24 24 4.038067 23 0.0005120 ***
696.6064_10.749 rel_abund_log2 b1 b3 24 24 -5.829105 23 0.0000061 ****
698.3189_3.775 rel_abund_log2 b1 b3 24 24 -2.244151 23 0.0347000 *
698.5121_7.962 rel_abund_log2 b1 b3 24 24 -2.546788 23 0.0180000 *
705.5178_5.308 rel_abund_log2 b1 b3 24 24 -3.584788 23 0.0015700 **
711.6251_10.854 rel_abund_log2 b1 b3 24 24 2.727884 23 0.0120000 *
716.5225_8.139 rel_abund_log2 b1 b3 24 24 3.376880 23 0.0026000 **
717.5179_5.106 rel_abund_log2 b1 b3 24 24 -2.633705 23 0.0148000 *
721.549_6 rel_abund_log2 b1 b3 24 24 -4.236895 23 0.0003120 ***
722.5123_7.861 rel_abund_log2 b1 b3 24 24 -3.736148 23 0.0010800 **
724.5276_8.3 rel_abund_log2 b1 b3 24 24 -3.470349 23 0.0020700 **
735.5203_5.846 rel_abund_log2 b1 b3 24 24 2.355306 23 0.0274000 *
736.5275_8.432 rel_abund_log2 b1 b3 24 24 -3.387484 23 0.0025300 **
740.5225_7.515 rel_abund_log2 b1 b3 24 24 2.785093 23 0.0105000 *
744.5538_9.321 rel_abund_log2 b1 b3 24 24 3.624494 23 0.0014200 **
746.5966_10.853 rel_abund_log2 b1 b3 24 24 4.830749 23 0.0000710 ****
748.5277_8.014 rel_abund_log2 b1 b3 24 24 -2.281994 23 0.0321000 *
749.5806_6.906 rel_abund_log2 b1 b3 24 24 -2.069449 23 0.0499000 *
750.5432_8.694 rel_abund_log2 b1 b3 24 24 -2.108353 23 0.0461000 *
750.5436_9.042 rel_abund_log2 b1 b3 24 24 -4.050904 23 0.0004960 ***
752.5591_9.514 rel_abund_log2 b1 b3 24 24 -2.279307 23 0.0322000 *
759.5646_6.287 rel_abund_log2 b1 b3 24 24 -4.619967 23 0.0001200 ***
761.5803_7.053 rel_abund_log2 b1 b3 24 24 -2.970127 23 0.0068500 **
762.5643_8.206 rel_abund_log2 b1 b3 24 24 -2.889935 23 0.0082600 **
762.6216_10.854 rel_abund_log2 b1 b3 24 24 3.036895 23 0.0058600 **
763.5516_6.749 rel_abund_log2 b1 b3 24 24 -2.775025 23 0.0108000 *
764.5225_7.43 rel_abund_log2 b1 b3 24 24 2.222037 23 0.0364000 *
764.5798_8.343 rel_abund_log2 b1 b3 24 24 -3.670107 23 0.0012700 **
765.5735_6.098 rel_abund_log2 b1 b3 24 24 -2.360399 23 0.0271000 *
771.5646_6.096 rel_abund_log2 b1 b3 24 24 -3.234385 23 0.0036600 **
773.5806_6.749 rel_abund_log2 b1 b3 24 24 -3.568133 23 0.0016300 **
775.5965_7.563 rel_abund_log2 b1 b3 24 24 -2.125432 23 0.0445000 *
776.5351_7.576 rel_abund_log2 b1 b3 24 24 -3.164678 23 0.0043300 **
776.5354_7.574 rel_abund_log2 b1 b3 24 24 -3.315384 23 0.0030200 **
777.6118_7.986 rel_abund_log2 b1 b3 24 24 -3.243935 23 0.0035800 **
780.4705_7.867 rel_abund_log2 b1 b3 24 24 -4.315718 23 0.0002560 ***
784.549_6.62 rel_abund_log2 b1 b3 24 24 2.270647 23 0.0328000 *
786.5646_7.575 rel_abund_log2 b1 b3 24 24 -4.533708 23 0.0001490 ***
788.5795_7.719 rel_abund_log2 b1 b3 24 24 -2.124118 23 0.0446000 *
789.6114_7.911 rel_abund_log2 b1 b3 24 24 -4.741910 23 0.0000886 ****
789.6116_8.177 rel_abund_log2 b1 b3 24 24 -3.725136 23 0.0011100 **
790.4993_7.863 rel_abund_log2 b1 b3 24 24 -3.861659 23 0.0007930 ***
790.5953_8.511 rel_abund_log2 b1 b3 24 24 3.705806 23 0.0011600 **
792.5765_7.938 rel_abund_log2 b1 b3 24 24 -2.111977 23 0.0458000 *
792.8596_0.515 rel_abund_log2 b1 b3 24 24 -2.089691 23 0.0479000 *
793.5985_8.748 rel_abund_log2 b1 b3 24 24 2.378696 23 0.0261000 *
793.5985_8.765 rel_abund_log2 b1 b3 24 24 4.680943 23 0.0001030 ***
794.5464_7.772 rel_abund_log2 b1 b3 24 24 4.067306 23 0.0004760 ***
795.5979_8.768 rel_abund_log2 b1 b3 24 24 2.572121 23 0.0170000 *
796.5458_7.771 rel_abund_log2 b1 b3 24 24 2.976022 23 0.0067600 **
798.5279_6.032 rel_abund_log2 b1 b3 24 24 -2.165916 23 0.0409000 *
800.5357_7.469 rel_abund_log2 b1 b3 24 24 -4.605652 23 0.0001240 ***
803.6275_8.749 rel_abund_log2 b1 b3 24 24 2.598700 23 0.0161000 *
803.6275_8.771 rel_abund_log2 b1 b3 24 24 3.584389 23 0.0015700 **
804.5762_7.774 rel_abund_log2 b1 b3 24 24 5.059518 23 0.0000402 ****
804.6308_8.768 rel_abund_log2 b1 b3 24 24 4.044895 23 0.0005030 ***
806.5463_7.553 rel_abund_log2 b1 b3 24 24 -2.935885 23 0.0074200 **
808.5018_9.051 rel_abund_log2 b1 b3 24 24 -3.201062 23 0.0039700 **
810.5642_6.968 rel_abund_log2 b1 b3 24 24 2.438649 23 0.0229000 *
810.5647_7.467 rel_abund_log2 b1 b3 24 24 -7.482269 23 0.0000001 ****
812.5436_6.468 rel_abund_log2 b1 b3 24 24 -4.271119 23 0.0002860 ***
812.58_7.898 rel_abund_log2 b1 b3 24 24 -4.973914 23 0.0000498 ****
814.5957_8.732 rel_abund_log2 b1 b3 24 24 -2.604246 23 0.0159000 *
815.627_8.417 rel_abund_log2 b1 b3 24 24 -3.483325 23 0.0020100 **
816.5751_7.553 rel_abund_log2 b1 b3 24 24 -2.742876 23 0.0116000 *
818.5302_6.479 rel_abund_log2 b1 b3 24 24 -2.365591 23 0.0268000 *
818.5304_6.915 rel_abund_log2 b1 b3 24 24 -2.557207 23 0.0176000 *
818.5462_7.192 rel_abund_log2 b1 b3 24 24 2.835585 23 0.0093700 **
818.5462_7.337 rel_abund_log2 b1 b3 24 24 -2.154764 23 0.0419000 *
818.6271_10.414 rel_abund_log2 b1 b3 24 24 5.341349 23 0.0000201 ****
819.6141_8.816 rel_abund_log2 b1 b3 24 24 -5.279463 23 0.0000234 ****
819.6141_9.024 rel_abund_log2 b1 b3 24 24 4.393267 23 0.0002110 ***
820.4801_7.866 rel_abund_log2 b1 b3 24 24 -3.549551 23 0.0017100 **
820.627_10.414 rel_abund_log2 b1 b3 24 24 3.803031 23 0.0009160 ***
821.6139_9.026 rel_abund_log2 b1 b3 24 24 5.291687 23 0.0000227 ****
822.5279_5.875 rel_abund_log2 b1 b3 24 24 -2.287061 23 0.0317000 *
822.5774_8.941 rel_abund_log2 b1 b3 24 24 4.138827 23 0.0003980 ***
823.6294_9.979 rel_abund_log2 b1 b3 24 24 4.012376 23 0.0005460 ***
824.5433_5.925 rel_abund_log2 b1 b3 24 24 -3.026049 23 0.0060100 **
824.5771_8.938 rel_abund_log2 b1 b3 24 24 4.416886 23 0.0001990 ***
824.5789_7.841 rel_abund_log2 b1 b3 24 24 -7.420025 23 0.0000002 ****
826.5606_6.953 rel_abund_log2 b1 b3 24 24 -3.202727 23 0.0039500 **
827.6272_7.905 rel_abund_log2 b1 b3 24 24 -6.361103 23 0.0000017 ****
828.5668_8.612 rel_abund_log2 b1 b3 24 24 -3.243486 23 0.0035900 **
828.5759_7.19 rel_abund_log2 b1 b3 24 24 3.793244 23 0.0009390 ***
828.5759_7.339 rel_abund_log2 b1 b3 24 24 -2.316699 23 0.0298000 *
828.6559_10.414 rel_abund_log2 b1 b3 24 24 4.139645 23 0.0003980 ***
829.6431_8.816 rel_abund_log2 b1 b3 24 24 -3.916073 23 0.0006930 ***
829.6432_9.024 rel_abund_log2 b1 b3 24 24 4.889329 23 0.0000614 ****
830.5815_7.188 rel_abund_log2 b1 b3 24 24 3.701337 23 0.0011800 **
831.6576_9.28 rel_abund_log2 b1 b3 24 24 -5.586808 23 0.0000110 ****
831.659_9.98 rel_abund_log2 b1 b3 24 24 4.610630 23 0.0001230 ***
832.6067_8.94 rel_abund_log2 b1 b3 24 24 3.470206 23 0.0020700 **
832.6428_10.551 rel_abund_log2 b1 b3 24 24 -2.586830 23 0.0165000 *
833.5544_7.557 rel_abund_log2 b1 b3 24 24 -2.973553 23 0.0068000 **
833.6294_9.395 rel_abund_log2 b1 b3 24 24 -5.143266 23 0.0000327 ****
834.5643_7.242 rel_abund_log2 b1 b3 24 24 -4.121127 23 0.0004160 ***
835.5322_8.336 rel_abund_log2 b1 b3 24 24 5.594273 23 0.0000108 ****
836.5434_6.295 rel_abund_log2 b1 b3 24 24 -2.920817 23 0.0076900 **
836.5799_7.605 rel_abund_log2 b1 b3 24 24 -2.967345 23 0.0069000 **
837.6571_10.552 rel_abund_log2 b1 b3 24 24 -3.419456 23 0.0023500 **
838.5955_8.279 rel_abund_log2 b1 b3 24 24 -3.303126 23 0.0031100 **
838.5956_8.612 rel_abund_log2 b1 b3 24 24 -3.747623 23 0.0010500 **
840.5304_6.407 rel_abund_log2 b1 b3 24 24 -4.255831 23 0.0002980 ***
840.5749_7.321 rel_abund_log2 b1 b3 24 24 -4.007795 23 0.0005520 ***
840.5749_7.471 rel_abund_log2 b1 b3 24 24 -6.173804 23 0.0000027 ****
840.6112_8.445 rel_abund_log2 b1 b3 24 24 -2.854226 23 0.0089800 **
841.5661_6.75 rel_abund_log2 b1 b3 24 24 -3.947521 23 0.0006410 ***
841.6406_8.452 rel_abund_log2 b1 b3 24 24 -5.937106 23 0.0000047 ****
842.5306_8.773 rel_abund_log2 b1 b3 24 24 -2.798642 23 0.0102000 *
842.5905_7.891 rel_abund_log2 b1 b3 24 24 -5.270597 23 0.0000239 ****
843.5493_6.926 rel_abund_log2 b1 b3 24 24 -2.481248 23 0.0208000 *
843.5839_7.561 rel_abund_log2 b1 b3 24 24 -2.410784 23 0.0243000 *
843.6586_9.396 rel_abund_log2 b1 b3 24 24 -6.449425 23 0.0000014 ****
844.562_8.02 rel_abund_log2 b1 b3 24 24 -3.449329 23 0.0021800 **
846.5617_8.018 rel_abund_log2 b1 b3 24 24 -2.789544 23 0.0104000 *
847.6304_9.032 rel_abund_log2 b1 b3 24 24 -3.122384 23 0.0047900 **
847.6455_10.298 rel_abund_log2 b1 b3 24 24 4.391609 23 0.0002120 ***
848.5114_9.046 rel_abund_log2 b1 b3 24 24 -3.994982 23 0.0005700 ***
848.577_8.458 rel_abund_log2 b1 b3 24 24 -2.656046 23 0.0141000 *
849.6458_10.294 rel_abund_log2 b1 b3 24 24 2.329912 23 0.0289000 *
849.6462_9.988 rel_abund_log2 b1 b3 24 24 -3.875267 23 0.0007660 ***
849.6616_10.589 rel_abund_log2 b1 b3 24 24 4.030695 23 0.0005210 ***
850.5595_6.407 rel_abund_log2 b1 b3 24 24 -3.911912 23 0.0007000 ***
851.6615_10.59 rel_abund_log2 b1 b3 24 24 3.776627 23 0.0009780 ***
853.619_10.659 rel_abund_log2 b1 b3 24 24 -5.096100 23 0.0000368 ****
853.6428_8.12 rel_abund_log2 b1 b3 24 24 -7.617053 23 0.0000001 ****
854.5519_7.576 rel_abund_log2 b1 b3 24 24 -4.846028 23 0.0000684 ****
854.5906_7.701 rel_abund_log2 b1 b3 24 24 -4.179896 23 0.0003600 ***
854.5918_8.021 rel_abund_log2 b1 b3 24 24 -3.994043 23 0.0005710 ***
854.6714_10.418 rel_abund_log2 b1 b3 24 24 -3.500019 23 0.0019300 **
855.59_8.755 rel_abund_log2 b1 b3 24 24 3.909666 23 0.0007040 ***
855.6591_9.033 rel_abund_log2 b1 b3 24 24 -4.526102 23 0.0001520 ***
856.5377_7.769 rel_abund_log2 b1 b3 24 24 2.512403 23 0.0195000 *
856.6051_8.21 rel_abund_log2 b1 b3 24 24 2.359549 23 0.0272000 *
856.6871_10.641 rel_abund_log2 b1 b3 24 24 4.058732 23 0.0004860 ***
857.5409_7.768 rel_abund_log2 b1 b3 24 24 2.214898 23 0.0369000 *
857.6737_9.513 rel_abund_log2 b1 b3 24 24 -7.688097 23 0.0000001 ****
857.6746_10.294 rel_abund_log2 b1 b3 24 24 4.053619 23 0.0004920 ***
857.6749_9.986 rel_abund_log2 b1 b3 24 24 -4.064599 23 0.0004790 ***
859.6907_10.59 rel_abund_log2 b1 b3 24 24 4.341753 23 0.0002400 ***
860.6919_10.384 rel_abund_log2 b1 b3 24 24 -4.827954 23 0.0000715 ****
861.5449_6.542 rel_abund_log2 b1 b3 24 24 2.361042 23 0.0271000 *
862.5261_7.47 rel_abund_log2 b1 b3 24 24 -4.463672 23 0.0001770 ***
862.527_7.471 rel_abund_log2 b1 b3 24 24 -5.396469 23 0.0000175 ****
862.5335_7.761 rel_abund_log2 b1 b3 24 24 3.285278 23 0.0032400 **
862.6535_10.583 rel_abund_log2 b1 b3 24 24 3.344010 23 0.0028200 **
862.664_10.445 rel_abund_log2 b1 b3 24 24 -2.098728 23 0.0470000 *
863.5644_9.582 rel_abund_log2 b1 b3 24 24 8.571089 23 0.0000000 ****
863.6765_10.683 rel_abund_log2 b1 b3 24 24 -2.120187 23 0.0450000 *
864.5747_7.263 rel_abund_log2 b1 b3 24 24 -4.530838 23 0.0001500 ***
865.6758_10.678 rel_abund_log2 b1 b3 24 24 -2.160360 23 0.0414000 *
866.6268_8.879 rel_abund_log2 b1 b3 24 24 2.523475 23 0.0190000 *
867.5493_6.755 rel_abund_log2 b1 b3 24 24 -3.594047 23 0.0015300 **
868.5303_7.476 rel_abund_log2 b1 b3 24 24 -5.165113 23 0.0000310 ****
870.5618_7.814 rel_abund_log2 b1 b3 24 24 -3.772769 23 0.0009870 ***
871.5805_8.017 rel_abund_log2 b1 b3 24 24 -3.065450 23 0.0054800 **
871.6147_8.768 rel_abund_log2 b1 b3 24 24 3.827734 23 0.0008620 ***
871.6891_10.337 rel_abund_log2 b1 b3 24 24 -8.679015 23 0.0000000 ****
872.5626_7.769 rel_abund_log2 b1 b3 24 24 5.230233 23 0.0000264 ****
872.5955_8.863 rel_abund_log2 b1 b3 24 24 -2.088552 23 0.0480000 *
872.6815_10.583 rel_abund_log2 b1 b3 24 24 3.650773 23 0.0013300 **
873.5954_8.46 rel_abund_log2 b1 b3 24 24 -2.096182 23 0.0473000 *
874.559_6.259 rel_abund_log2 b1 b3 24 24 -2.919313 23 0.0077200 **
874.6643_9.99 rel_abund_log2 b1 b3 24 24 -2.695984 23 0.0129000 *
876.5748_6.674 rel_abund_log2 b1 b3 24 24 -2.894907 23 0.0081700 **
878.5903_7.305 rel_abund_log2 b1 b3 24 24 -5.264773 23 0.0000242 ****
878.5909_7.805 rel_abund_log2 b1 b3 24 24 -3.463762 23 0.0021100 **
879.5263_6.489 rel_abund_log2 b1 b3 24 24 -2.945916 23 0.0072500 **
880.5375_7.198 rel_abund_log2 b1 b3 24 24 2.342301 23 0.0282000 *
880.6062_8.116 rel_abund_log2 b1 b3 24 24 -2.255782 23 0.0339000 *
880.6062_8.517 rel_abund_log2 b1 b3 24 24 -3.721959 23 0.0011200 **
881.5397_7.202 rel_abund_log2 b1 b3 24 24 2.787655 23 0.0105000 *
881.6055_9.023 rel_abund_log2 b1 b3 24 24 4.164691 23 0.0003730 ***
882.6209_8.855 rel_abund_log2 b1 b3 24 24 -3.568648 23 0.0016300 **
883.5331_7.753 rel_abund_log2 b1 b3 24 24 -3.287512 23 0.0032300 **
883.5565_8.118 rel_abund_log2 b1 b3 24 24 3.076754 23 0.0053300 **
883.6211_9.976 rel_abund_log2 b1 b3 24 24 4.957314 23 0.0000519 ****
884.5687_8.94 rel_abund_log2 b1 b3 24 24 4.617911 23 0.0001210 ***
885.7055_10.58 rel_abund_log2 b1 b3 24 24 -2.949622 23 0.0071900 **
887.5646_9.463 rel_abund_log2 b1 b3 24 24 2.747165 23 0.0115000 *
887.5991_9.03 rel_abund_log2 b1 b3 24 24 6.062154 23 0.0000035 ****
888.5362_7.768 rel_abund_log2 b1 b3 24 24 3.162758 23 0.0043500 **
889.617_9.974 rel_abund_log2 b1 b3 24 24 3.770904 23 0.0009920 ***
890.5649_8.939 rel_abund_log2 b1 b3 24 24 3.445767 23 0.0022000 **
896.5624_7.191 rel_abund_log2 b1 b3 24 24 3.417623 23 0.0023600 **
896.6737_10.623 rel_abund_log2 b1 b3 24 24 3.421006 23 0.0023400 **
897.6305_9.024 rel_abund_log2 b1 b3 24 24 3.843371 23 0.0008290 ***
905.6028_9.99 rel_abund_log2 b1 b3 24 24 -2.338062 23 0.0284000 *
905.6039_10.298 rel_abund_log2 b1 b3 24 24 3.261735 23 0.0034300 **
906.5531_8.016 rel_abund_log2 b1 b3 24 24 -2.943948 23 0.0072900 **
906.5828_8.614 rel_abund_log2 b1 b3 24 24 -2.892792 23 0.0082100 **
907.6211_9.035 rel_abund_log2 b1 b3 24 24 -2.797835 23 0.0102000 *
908.5688_8.459 rel_abund_log2 b1 b3 24 24 -2.561187 23 0.0175000 *
908.6381_10.644 rel_abund_log2 b1 b3 24 24 2.512136 23 0.0195000 *
909.6366_10.295 rel_abund_log2 b1 b3 24 24 3.832321 23 0.0008520 ***
909.6368_9.99 rel_abund_log2 b1 b3 24 24 -4.206949 23 0.0003360 ***
911.6461_9.397 rel_abund_log2 b1 b3 24 24 -4.245416 23 0.0003050 ***
913.6162_9.035 rel_abund_log2 b1 b3 24 24 -3.083764 23 0.0052500 **
913.6613_10.438 rel_abund_log2 b1 b3 24 24 -2.396641 23 0.0251000 *
914.5643_8.457 rel_abund_log2 b1 b3 24 24 -2.239444 23 0.0351000 *
915.6319_9.987 rel_abund_log2 b1 b3 24 24 -2.692394 23 0.0130000 *
915.6327_10.293 rel_abund_log2 b1 b3 24 24 3.977629 23 0.0005950 ***
917.5422_7.049 rel_abund_log2 b1 b3 24 24 2.645195 23 0.0145000 *
917.6329_9.989 rel_abund_log2 b1 b3 24 24 -3.344524 23 0.0028100 **
917.633_10.292 rel_abund_log2 b1 b3 24 24 2.352180 23 0.0276000 *
917.6482_10.589 rel_abund_log2 b1 b3 24 24 2.952557 23 0.0071400 **
918.5466_6.408 rel_abund_log2 b1 b3 24 24 -2.883008 23 0.0084000 **
918.5543_7.768 rel_abund_log2 b1 b3 24 24 4.396768 23 0.0002090 ***
918.5546_7.77 rel_abund_log2 b1 b3 24 24 3.168979 23 0.0042800 **
919.2277_0.616 rel_abund_log2 b1 b3 24 24 4.057019 23 0.0004880 ***
919.6483_10.59 rel_abund_log2 b1 b3 24 24 2.139708 23 0.0432000 *
920.6735_10.31 rel_abund_log2 b1 b3 24 24 -6.052016 23 0.0000036 ****
922.5024_7.08 rel_abund_log2 b1 b3 24 24 2.287672 23 0.0317000 *
922.5774_7.695 rel_abund_log2 b1 b3 24 24 -3.437800 23 0.0022400 **
922.5781_8.016 rel_abund_log2 b1 b3 24 24 -3.552545 23 0.0017000 **
923.646_9.035 rel_abund_log2 b1 b3 24 24 -4.202579 23 0.0003400 ***
923.6524_10.353 rel_abund_log2 b1 b3 24 24 -6.423635 23 0.0000015 ****
924.5935_8.459 rel_abund_log2 b1 b3 24 24 -2.324461 23 0.0293000 *
925.6617_9.988 rel_abund_log2 b1 b3 24 24 -4.309254 23 0.0002600 ***
927.677_10.59 rel_abund_log2 b1 b3 24 24 3.910058 23 0.0007030 ***
93.0344_0.646 rel_abund_log2 b1 b3 24 24 3.075428 23 0.0053500 **
930.5504_7.815 rel_abund_log2 b1 b3 24 24 -3.587048 23 0.0015600 **
931.5514_9.582 rel_abund_log2 b1 b3 24 24 7.026738 23 0.0000004 ****
931.6162_9.992 rel_abund_log2 b1 b3 24 24 -2.384761 23 0.0257000 *
931.6162_9.999 rel_abund_log2 b1 b3 24 24 -3.013496 23 0.0061900 **
933.5855_8.781 rel_abund_log2 b1 b3 24 24 3.177299 23 0.0042000 **
934.5326_7.772 rel_abund_log2 b1 b3 24 24 3.266415 23 0.0033900 **
936.5439_7.803 rel_abund_log2 b1 b3 24 24 -2.627182 23 0.0151000 *
938.5513_8.018 rel_abund_log2 b1 b3 24 24 -2.166164 23 0.0409000 *
939.6769_10.335 rel_abund_log2 b1 b3 24 24 -6.354445 23 0.0000018 ****
940.5496_7.764 rel_abund_log2 b1 b3 24 24 3.822051 23 0.0008740 ***
942.5548_7.339 rel_abund_log2 b1 b3 24 24 -2.355364 23 0.0274000 *
942.5549_7.193 rel_abund_log2 b1 b3 24 24 2.155616 23 0.0418000 *
945.5095_6.552 rel_abund_log2 b1 b3 24 24 2.735307 23 0.0118000 *
945.6385_9.975 rel_abund_log2 b1 b3 24 24 4.917278 23 0.0000573 ****
946.5851_8.939 rel_abund_log2 b1 b3 24 24 2.554640 23 0.0177000 *
948.5172_7.192 rel_abund_log2 b1 b3 24 24 2.677992 23 0.0134000 *
950.6082_8.859 rel_abund_log2 b1 b3 24 24 -4.064704 23 0.0004790 ***
958.5324_7.191 rel_abund_log2 b1 b3 24 24 3.979074 23 0.0005930 ***
959.6018_9.026 rel_abund_log2 b1 b3 24 24 3.695640 23 0.0011900 **
960.7412_11.038 rel_abund_log2 b1 b3 24 24 -4.385688 23 0.0002150 ***
961.6178_9.977 rel_abund_log2 b1 b3 24 24 3.383217 23 0.0025600 **
964.5495_7.339 rel_abund_log2 b1 b3 24 24 -2.276145 23 0.0325000 *
967.6322_9.976 rel_abund_log2 b1 b3 24 24 4.411283 23 0.0002020 ***
968.5707_8.019 rel_abund_log2 b1 b3 24 24 -2.350355 23 0.0277000 *
968.581_8.937 rel_abund_log2 b1 b3 24 24 3.835836 23 0.0008450 ***
969.6384_9.033 rel_abund_log2 b1 b3 24 24 -2.549003 23 0.0179000 *
970.5858_8.459 rel_abund_log2 b1 b3 24 24 -2.554209 23 0.0177000 *
970.6153_10.616 rel_abund_log2 b1 b3 24 24 -2.201530 23 0.0380000 *
971.6542_9.988 rel_abund_log2 b1 b3 24 24 -4.184361 23 0.0003560 ***
976.5477_8.457 rel_abund_log2 b1 b3 24 24 -3.382561 23 0.0025600 **
983.6184_9.976 rel_abund_log2 b1 b3 24 24 -4.397506 23 0.0002090 ***
983.6185_9.993 rel_abund_log2 b1 b3 24 24 -3.842628 23 0.0008310 ***
985.616_9.034 rel_abund_log2 b1 b3 24 24 -3.264112 23 0.0034100 **
986.5637_8.459 rel_abund_log2 b1 b3 24 24 -2.528186 23 0.0188000 *
987.6318_9.987 rel_abund_log2 b1 b3 24 24 -3.493884 23 0.0019600 **
991.6331_9.034 rel_abund_log2 b1 b3 24 24 -2.357923 23 0.0273000 *
992.5806_8.459 rel_abund_log2 b1 b3 24 24 -3.090919 23 0.0051600 **
993.6487_10.29 rel_abund_log2 b1 b3 24 24 3.469618 23 0.0020800 **
993.6488_9.986 rel_abund_log2 b1 b3 24 24 -4.059540 23 0.0004850 ***
# how many are significant?
nrow(tomato_t.test_paired_sig)
## [1] 388
Remove BG diet
# let's grab both datasets for features sig in pre v post red and pre v post control and combine them
fulljoin_t.test_tomANDctrl <- full_join(tomato_t.test_paired_sig, ctrl_t.test_paired_sig,
                                        by = "mz_rt",
                                        suffix = c(".tom", ".ctrl"))

# number features in full list
nrow(fulljoin_t.test_tomANDctrl)
## [1] 441

Let’s try and remove features significant due to the background diet

sig_paired_tom_rmBG <- fulljoin_t.test_tomANDctrl %>%
  # add a column to account for direction
  mutate(sign = statistic.tom * statistic.ctrl) %>%
  # replace NAs in the sign column with 0
  mutate(sign = replace_na(sign, 0)) %>%
  # replace NAs in the statistic.ctrl column to 0
  mutate(statistic.ctrl = replace_na(statistic.ctrl, 0)) %>%
  # filter for columns that are either negative (means ctrl and tomato are going in opposite dir) or where the stat.ctrl col is 0 (so we don't remove features that are just not present in the sig control list)
  filter((sign < 0 | statistic.ctrl == 0))

# number of features in new list without bg diet effect
nrow(sig_paired_tom_rmBG)
## [1] 219

How many BG-diet-related features did we remove from the list of significant beta features?

nrow(tomato_t.test_paired_sig) - nrow(sig_paired_tom_rmBG)
## [1] 169
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA. Let’s take our new feature list (background diet effect removed)

# select only features from paired list that have a match in ANOVA list
tom_sig_ANOVA_overlap_paired <- inner_join(sig_paired_tom_rmBG,
                                            trt_tukeyHSD_sig,
                                            by = "mz_rt",
                                            suffix = c(".t-test", ".tukeys"))

# features overlapping with sig ANOVA
unique(tom_sig_ANOVA_overlap_paired$mz_rt)
##  [1] "1002.5196_7.769" "1561.2028_9.038" "244.908_0.706"   "526.3144_2.683" 
##  [5] "560.2269_6.891"  "674.6039_10.834" "682.6332_10.835" "705.5178_5.308" 
##  [9] "721.549_6"       "736.5275_8.432"  "764.5798_8.343"  "800.5357_7.469" 
## [13] "824.5771_8.938"  "847.6455_10.298" "848.5114_9.046"  "853.619_10.659" 
## [17] "857.6749_9.986"  "862.5335_7.761"  "863.5644_9.582"  "868.5303_7.476" 
## [21] "887.5991_9.03"   "905.6028_9.99"   "907.6211_9.035"  "909.6368_9.99"  
## [25] "915.6327_10.293" "917.6329_9.989"  "940.5496_7.764"  "945.6385_9.975" 
## [29] "969.6384_9.033"  "983.6184_9.976"  "983.6185_9.993"  "987.6318_9.987"
Mummichog list
paired_tomato_for_mummichog <- tomato_t.test_paired %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(paired_red_for_mummichog,
          "for mummichog analysis/t-test-res-tomato-paired.csv")

Here, I will compare control to each tomato treatment individually, and then tomato treatments against each other. I will also compare tomato to control. I am using the log transformed values of rel abundance since parametric tests assume normality.

Red v ctrl

# run t-test
red_v_ctrl_t.test <- df_for_stats %>%
  filter(treatment %in% c("control", "red")) %>%
  filter(period == "b3") %>%
  dplyr::select(subject, treatment, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ treatment, 
         paired = FALSE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
sig_red_v_ctrl_t.test <- red_v_ctrl_t.test %>%
  filter(p < 0.05)
kable(sig_red_v_ctrl_t.test)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
151.0261_0.612 rel_abund_log2 control red 11 12 2.338023 16.36047 0.03240 *
244.908_0.706 rel_abund_log2 control red 11 12 -3.452634 20.96521 0.00239 **
362.9406_0.501 rel_abund_log2 control red 11 12 2.415061 15.52626 0.02850 *
605.4051_5.422 rel_abund_log2 control red 11 12 -2.400517 20.64957 0.02590 *
705.5178_5.308 rel_abund_log2 control red 11 12 -2.121762 20.23735 0.04640 *
711.5035_5.685 rel_abund_log2 control red 11 12 -2.513206 19.15979 0.02110 *
737.5362_6.543 rel_abund_log2 control red 11 12 2.409275 20.99867 0.02520 *
860.6369_10.19 rel_abund_log2 control red 11 12 -2.107560 20.55172 0.04750 *
877.5224_6.543 rel_abund_log2 control red 11 12 2.370644 20.53763 0.02760 *
880.6062_8.116 rel_abund_log2 control red 11 12 2.088743 20.83942 0.04920 *
890.5493_8.144 rel_abund_log2 control red 11 12 -2.742924 20.97983 0.01220 *
895.6025_10.452 rel_abund_log2 control red 11 12 -2.654041 20.99974 0.01480 *
895.6211_9.665 rel_abund_log2 control red 11 12 2.163212 20.79662 0.04230 *
929.5358_8.639 rel_abund_log2 control red 11 12 -2.233441 20.71595 0.03670 *
931.6164_10.288 rel_abund_log2 control red 11 12 2.453375 20.32427 0.02330 *
945.5095_6.552 rel_abund_log2 control red 11 12 2.145392 16.42973 0.04720 *
945.6385_9.975 rel_abund_log2 control red 11 12 2.527456 20.03467 0.02000 *
# how many are significant?
nrow(sig_red_v_ctrl_t.test)
## [1] 17
ANOVA overlap

Keep sig features in unpaired t-test that have a match in sig ANOVA

sig_overlap_ctrl_red <- inner_join(sig_red_v_ctrl_t.test,
                                   trt_tukeyHSD_sig,
                                   by = "mz_rt",
                                   suffix = c(".t-test", ".tukeys"))

unique(sig_overlap_ctrl_red$mz_rt)
## [1] "244.908_0.706"  "705.5178_5.308" "711.5035_5.685" "890.5493_8.144"
## [5] "895.6211_9.665" "945.6385_9.975"
Mummichog list
ctrl_v_red_for_mummichog <- red_v_ctrl_t.test %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(ctrl_v_red_for_mummichog,
          "for mummichog analysis/t-test-res-ctrl-v-red.csv")

Beta v ctrl

# run t-tests
beta_v_ctrl_t.test <- df_for_stats %>%
  filter(treatment %in% c("control" , "beta"),
         period == "b3") %>%
  dplyr::select(subject, treatment, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ treatment, 
         paired = FALSE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
sig_beta_v_ctrl_t.test <- beta_v_ctrl_t.test %>%
  filter(p < 0.05)
kable(sig_beta_v_ctrl_t.test)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
1271.7465_5.862 rel_abund_log2 beta control 12 11 -2.602354 16.99728 0.01860 *
1440.1025_6.541 rel_abund_log2 beta control 12 11 -2.498830 19.70687 0.02140 *
1450.1318_6.54 rel_abund_log2 beta control 12 11 -2.261593 17.61030 0.03660 *
1502.0921_6.54 rel_abund_log2 beta control 12 11 -2.601254 20.35857 0.01690 *
1518.1184_6.541 rel_abund_log2 beta control 12 11 -2.642154 18.11451 0.01650 *
1612.0825_7.034 rel_abund_log2 beta control 12 11 -2.578554 20.81114 0.01760 *
1644.3337_9.984 rel_abund_log2 beta control 12 11 -3.083046 18.75198 0.00619 **
1646.3475_10.439 rel_abund_log2 beta control 12 11 -2.189729 13.27898 0.04700 *
445.3316_4.28 rel_abund_log2 beta control 12 11 -2.634209 20.98463 0.01550 *
557.4566_6.309 rel_abund_log2 beta control 12 11 -2.178572 17.72385 0.04310 *
575.467_4.662 rel_abund_log2 beta control 12 11 -2.327719 19.80703 0.03060 *
654.31_3.076 rel_abund_log2 beta control 12 11 2.867323 20.75135 0.00929 **
737.5193_5.846 rel_abund_log2 beta control 12 11 -2.240287 20.78231 0.03610 *
737.5362_6.543 rel_abund_log2 beta control 12 11 -2.614394 16.17349 0.01870 *
745.5498_5.846 rel_abund_log2 beta control 12 11 -2.159582 20.62657 0.04270 *
764.5548_6.543 rel_abund_log2 beta control 12 11 -3.122747 15.46343 0.00678 **
767.5664_7.562 rel_abund_log2 beta control 12 11 -2.527314 20.00745 0.02000 *
797.5117_5.847 rel_abund_log2 beta control 12 11 -2.608931 20.73450 0.01650 *
803.5076_5.847 rel_abund_log2 beta control 12 11 -2.145926 20.86749 0.04380 *
819.6141_9.024 rel_abund_log2 beta control 12 11 -2.315440 20.88308 0.03080 *
821.565_7.768 rel_abund_log2 beta control 12 11 2.410504 20.46941 0.02540 *
821.6152_8.817 rel_abund_log2 beta control 12 11 -2.242101 20.54913 0.03610 *
829.6432_9.024 rel_abund_log2 beta control 12 11 -2.109984 20.99862 0.04700 *
833.6297_9.665 rel_abund_log2 beta control 12 11 -2.412993 20.99947 0.02500 *
843.6587_9.666 rel_abund_log2 beta control 12 11 -2.531978 20.89053 0.01940 *
847.6455_10.298 rel_abund_log2 beta control 12 11 -2.409479 20.95110 0.02530 *
853.6428_8.12 rel_abund_log2 beta control 12 11 -2.356496 20.26352 0.02860 *
855.6591_9.033 rel_abund_log2 beta control 12 11 -2.187249 18.52780 0.04180 *
857.6746_10.294 rel_abund_log2 beta control 12 11 -2.186688 20.47124 0.04050 *
869.598_7.834 rel_abund_log2 beta control 12 11 -2.265410 20.94333 0.03420 *
877.5224_6.543 rel_abund_log2 beta control 12 11 -2.086665 20.96393 0.04930 *
886.5199_7.016 rel_abund_log2 beta control 12 11 2.438518 18.87384 0.02480 *
890.5493_8.144 rel_abund_log2 beta control 12 11 2.103000 20.71634 0.04790 *
895.6211_9.665 rel_abund_log2 beta control 12 11 -2.483772 20.49984 0.02170 *
896.6737_10.623 rel_abund_log2 beta control 12 11 -2.117449 19.00880 0.04760 *
903.5878_9.033 rel_abund_log2 beta control 12 11 -2.870222 19.78432 0.00953 **
904.599_5.836 rel_abund_log2 beta control 12 11 -2.449384 20.44569 0.02340 *
907.6211_9.035 rel_abund_log2 beta control 12 11 -2.927436 16.99932 0.00940 **
911.6459_9.666 rel_abund_log2 beta control 12 11 -2.515074 20.74477 0.02020 *
913.6162_9.035 rel_abund_log2 beta control 12 11 -2.368208 20.03066 0.02800 *
917.633_10.292 rel_abund_log2 beta control 12 11 -2.170774 20.43166 0.04190 *
923.646_9.035 rel_abund_log2 beta control 12 11 -2.772763 20.76640 0.01150 *
931.6164_10.288 rel_abund_log2 beta control 12 11 -2.372446 19.13541 0.02830 *
945.6385_9.975 rel_abund_log2 beta control 12 11 -2.665153 19.65665 0.01500 *
950.5333_8.144 rel_abund_log2 beta control 12 11 2.392149 17.30117 0.02840 *
967.6322_9.976 rel_abund_log2 beta control 12 11 -2.774084 19.40881 0.01190 *
969.6092_10.587 rel_abund_log2 beta control 12 11 2.401877 20.33160 0.02600 *
985.616_9.034 rel_abund_log2 beta control 12 11 -2.247727 20.07430 0.03600 *
991.6331_9.034 rel_abund_log2 beta control 12 11 -2.236592 18.15637 0.03810 *
# how many are significant?
nrow(sig_beta_v_ctrl_t.test)
## [1] 49
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA

sig_overlap_ctrl_beta <- inner_join(sig_beta_v_ctrl_t.test,
                                   trt_tukeyHSD_sig,
                                   by = "mz_rt",
                                   suffix = c(".t-test", ".tukeys"))

# which features overlap?
unique(sig_overlap_ctrl_beta$mz_rt)
##  [1] "1271.7465_5.862"  "1646.3475_10.439" "557.4566_6.309"   "575.467_4.662"   
##  [5] "764.5548_6.543"   "767.5664_7.562"   "797.5117_5.847"   "819.6141_9.024"  
##  [9] "829.6432_9.024"   "833.6297_9.665"   "843.6587_9.666"   "847.6455_10.298" 
## [13] "853.6428_8.12"    "855.6591_9.033"   "857.6746_10.294"  "869.598_7.834"   
## [17] "886.5199_7.016"   "890.5493_8.144"   "895.6211_9.665"   "903.5878_9.033"  
## [21] "907.6211_9.035"   "911.6459_9.666"   "913.6162_9.035"   "923.646_9.035"   
## [25] "945.6385_9.975"   "985.616_9.034"
Mummichog list
ctrl_v_beta_for_mummichog <- beta_v_ctrl_t.test %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(ctrl_v_beta_for_mummichog,
          "for mummichog analysis/t-test-res-ctrl-v-beta.csv")

Beta v red

# run t-tests
beta_v_red_t.test <- df_for_stats %>%
  filter(treatment %in% c("beta", "red"),
         period == "b3") %>%
  dplyr::select(subject, treatment, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ treatment, 
         paired = FALSE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
sig_beta_v_red_t.test <- beta_v_red_t.test %>%
  filter(p < 0.05)
kable(sig_beta_v_red_t.test)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
244.908_0.706 rel_abund_log2 beta red 12 12 -2.099288 21.52667 0.04780 *
297.1527_2.281 rel_abund_log2 beta red 12 12 2.770830 21.98423 0.01120 *
311.1683_2.682 rel_abund_log2 beta red 12 12 2.669852 19.44820 0.01490 *
362.9406_0.501 rel_abund_log2 beta red 12 12 3.560133 18.97481 0.00209 **
473.3629_4.632 rel_abund_log2 beta red 12 12 -2.397707 21.54749 0.02560 *
532.2989_3.075 rel_abund_log2 beta red 12 12 2.946249 16.22111 0.00938 **
557.4566_6.309 rel_abund_log2 beta red 12 12 -2.889624 19.50467 0.00922 **
559.4719_6.867 rel_abund_log2 beta red 12 12 -2.371316 18.25286 0.02890 *
591.462_4.314 rel_abund_log2 beta red 12 12 -2.419627 21.99982 0.02420 *
654.31_3.076 rel_abund_log2 beta red 12 12 2.679382 21.32549 0.01390 *
711.5035_5.685 rel_abund_log2 beta red 12 12 -2.076854 21.94549 0.04970 *
797.5117_5.847 rel_abund_log2 beta red 12 12 -2.196075 21.92973 0.03900 *
818.6271_10.414 rel_abund_log2 beta red 12 12 -2.330254 21.99011 0.02940 *
820.5155_3.079 rel_abund_log2 beta red 12 12 3.050123 19.73669 0.00639 **
830.5005_2.723 rel_abund_log2 beta red 12 12 2.198696 15.31911 0.04370 *
840.6112_8.445 rel_abund_log2 beta red 12 12 -2.925405 19.19274 0.00862 **
849.4911_5.685 rel_abund_log2 beta red 12 12 -2.299673 21.95091 0.03140 *
853.619_10.659 rel_abund_log2 beta red 12 12 -2.104137 21.98626 0.04700 *
860.6369_10.19 rel_abund_log2 beta red 12 12 -2.137842 21.45621 0.04420 *
878.584_5.681 rel_abund_log2 beta red 12 12 -2.223055 21.24129 0.03720 *
903.5878_9.033 rel_abund_log2 beta red 12 12 -3.393211 18.39625 0.00316 **
# how many are significant?
nrow(sig_beta_v_red_t.test)
## [1] 21
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA

sig_overlap_beta_red <- inner_join(sig_beta_v_red_t.test,
                                   trt_tukeyHSD_sig,
                                   by = "mz_rt",
                                   suffix = c(".t-test", ".tukeys"))

# which features overlap?
unique(sig_overlap_beta_red$mz_rt)
## [1] "244.908_0.706"   "557.4566_6.309"  "559.4719_6.867"  "591.462_4.314"  
## [5] "711.5035_5.685"  "797.5117_5.847"  "818.6271_10.414" "853.619_10.659" 
## [9] "903.5878_9.033"
Mummichog list
beta_v_red_for_mummichog <- beta_v_red_t.test %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(beta_v_red_for_mummichog,
          "for mummichog analysis/t-test-res-beta-v-red.csv")

Tomato v ctrl

# run t-tests
tom_v_ctrl_t.test <- df_for_stats %>%
  filter(tomato_or_control %in% c("control", "tomato"),
         period == "b3") %>%
  dplyr::select(subject, tomato_or_control, mz_rt, rel_abund_log2) %>%
  group_by(mz_rt) %>%
  t_test(rel_abund_log2 ~ tomato_or_control, 
         paired = FALSE, 
         p.adjust.method = "BH") %>% # Benjamini-Hochberg controlling to lower false positives
  add_significance()

Statistically significant features

# which features are significant?
sig_tom_v_ctrl_t.test <- tom_v_ctrl_t.test %>%
  filter(p < 0.05)
kable(sig_tom_v_ctrl_t.test)
mz_rt .y. group1 group2 n1 n2 statistic df p p.signif
1440.1025_6.541 rel_abund_log2 control tomato 11 24 2.697449 26.30317 0.01200 *
1450.1318_6.54 rel_abund_log2 control tomato 11 24 2.162725 28.17691 0.03920 *
1502.0921_6.54 rel_abund_log2 control tomato 11 24 2.254239 24.47013 0.03340 *
1518.1184_6.541 rel_abund_log2 control tomato 11 24 2.559290 29.02690 0.01600 *
1644.3337_9.984 rel_abund_log2 control tomato 11 24 3.122548 27.03693 0.00424 **
1646.3475_10.439 rel_abund_log2 control tomato 11 24 2.107761 32.56337 0.04280 *
244.908_0.706 rel_abund_log2 control tomato 11 24 -2.849128 22.07836 0.00931 **
526.3144_2.683 rel_abund_log2 control tomato 11 24 -2.114205 24.24561 0.04500 *
605.4051_5.422 rel_abund_log2 control tomato 11 24 -2.448664 30.43772 0.02030 *
737.5362_6.543 rel_abund_log2 control tomato 11 24 3.093542 30.22575 0.00423 **
745.5498_5.846 rel_abund_log2 control tomato 11 24 2.072676 22.54078 0.04980 *
764.5548_6.543 rel_abund_log2 control tomato 11 24 2.799299 32.96766 0.00849 **
767.5664_7.562 rel_abund_log2 control tomato 11 24 2.470170 25.78700 0.02040 *
775.5965_7.563 rel_abund_log2 control tomato 11 24 2.107058 31.71271 0.04310 *
788.5437_6.549 rel_abund_log2 control tomato 11 24 -2.387040 30.29985 0.02340 *
803.5076_5.847 rel_abund_log2 control tomato 11 24 2.128987 19.93580 0.04590 *
819.6141_9.024 rel_abund_log2 control tomato 11 24 2.335152 20.56272 0.02980 *
821.565_7.768 rel_abund_log2 control tomato 11 24 -2.514823 17.29324 0.02210 *
821.6139_9.026 rel_abund_log2 control tomato 11 24 2.170798 18.09512 0.04350 *
829.6432_9.024 rel_abund_log2 control tomato 11 24 2.198822 20.17973 0.03970 *
833.6297_9.665 rel_abund_log2 control tomato 11 24 2.494656 23.32964 0.02010 *
835.6457_10.444 rel_abund_log2 control tomato 11 24 2.294734 32.89860 0.02830 *
843.6587_9.666 rel_abund_log2 control tomato 11 24 2.165548 23.80584 0.04060 *
847.6455_10.298 rel_abund_log2 control tomato 11 24 2.492918 25.05938 0.01960 *
855.6591_9.033 rel_abund_log2 control tomato 11 24 2.389511 26.77448 0.02420 *
857.6746_10.294 rel_abund_log2 control tomato 11 24 2.410083 26.40524 0.02320 *
869.598_7.834 rel_abund_log2 control tomato 11 24 2.111475 19.29221 0.04800 *
877.5224_6.543 rel_abund_log2 control tomato 11 24 2.644829 22.23392 0.01470 *
886.5199_7.016 rel_abund_log2 control tomato 11 24 -2.643888 27.67046 0.01330 *
890.5493_8.144 rel_abund_log2 control tomato 11 24 -2.821312 20.34803 0.01040 *
895.6211_9.665 rel_abund_log2 control tomato 11 24 2.790066 23.61123 0.01030 *
907.6211_9.035 rel_abund_log2 control tomato 11 24 2.873048 30.43628 0.00734 **
911.6459_9.666 rel_abund_log2 control tomato 11 24 2.199363 21.02825 0.03920 *
913.6162_9.035 rel_abund_log2 control tomato 11 24 2.421647 22.29324 0.02400 *
915.6327_10.293 rel_abund_log2 control tomato 11 24 2.394575 31.08177 0.02290 *
923.646_9.035 rel_abund_log2 control tomato 11 24 2.668043 21.54311 0.01420 *
924.518_7.766 rel_abund_log2 control tomato 11 24 -2.080283 26.40791 0.04730 *
931.6164_10.288 rel_abund_log2 control tomato 11 24 2.962534 26.56891 0.00636 **
945.5095_6.552 rel_abund_log2 control tomato 11 24 2.716900 32.63198 0.01050 *
945.6385_9.975 rel_abund_log2 control tomato 11 24 3.060858 22.80094 0.00557 **
950.5333_8.144 rel_abund_log2 control tomato 11 24 -2.051392 29.80883 0.04910 *
967.6322_9.976 rel_abund_log2 control tomato 11 24 2.919161 26.49412 0.00708 **
969.6092_10.587 rel_abund_log2 control tomato 11 24 -2.231956 21.04607 0.03660 *
971.6542_9.988 rel_abund_log2 control tomato 11 24 2.179708 20.40680 0.04120 *
985.616_9.034 rel_abund_log2 control tomato 11 24 2.495541 24.00961 0.01980 *
991.6331_9.034 rel_abund_log2 control tomato 11 24 2.050243 29.21562 0.04940 *
# how many are significant?
nrow(sig_tom_v_ctrl_t.test)
## [1] 46
ANOVA overlap

Keep sig features in t-test that have a match in sig ANOVA

sig_overlap_tom_ctrl <- inner_join(sig_tom_v_ctrl_t.test,
                                   trt_tukeyHSD_sig,
                                   by = "mz_rt",
                                   suffix = c(".t-test", ".tukeys"))

# which features overlap?
unique(sig_overlap_tom_ctrl$mz_rt)
##  [1] "1646.3475_10.439" "244.908_0.706"    "526.3144_2.683"   "764.5548_6.543"  
##  [5] "767.5664_7.562"   "819.6141_9.024"   "821.6139_9.026"   "829.6432_9.024"  
##  [9] "833.6297_9.665"   "835.6457_10.444"  "843.6587_9.666"   "847.6455_10.298" 
## [13] "855.6591_9.033"   "857.6746_10.294"  "869.598_7.834"    "886.5199_7.016"  
## [17] "890.5493_8.144"   "895.6211_9.665"   "907.6211_9.035"   "911.6459_9.666"  
## [21] "913.6162_9.035"   "915.6327_10.293"  "923.646_9.035"    "924.518_7.766"   
## [25] "945.6385_9.975"   "971.6542_9.988"   "985.616_9.034"
Mummichog list
tom_v_ctrl_for_mummichog <- tom_v_ctrl_t.test %>%
  dplyr::select(mz_rt,
         p,
         statistic) %>%
  separate(col = mz_rt,
           into = c("m/z", "rt"),
           sep = "_") %>%
  rename("p-value" = "p") %>%
  rename("t-score" = "statistic")

write_csv(tom_v_ctrl_for_mummichog,
          "for mummichog analysis/t-test-res-ctrl-v-tomato.csv")

Heatmaps

ANOVA

# go back to wide for stats df
df_for_stats_wide <- df_for_stats %>%
  pivot_wider(names_from = mz_rt,
              values_from = rel_abund_log2)

ANOVA_trtperiod_heatmap_data <- df_for_stats_wide %>%
  filter(period == "b3") %>%
  dplyr::select(sample, 
                all_of(trt_anova_sig$mz_rt)) %>%
  column_to_rownames("sample")

head(ANOVA_trtperiod_heatmap_data, n=3)
##                         1334.2417_10.855 1335.245_10.854 1554.1226_7.773
## x5107_b3_beta_c18neg_28         11.89168        11.93301        13.11223
## x5109_b3_beta_c18neg_81         11.35384        11.39136        12.35018
## x5112_b3_beta_c18neg_56         11.66017        11.60905        12.46035
##                         1561.2028_9.038 201.0226_0.688 244.908_0.706
## x5107_b3_beta_c18neg_28        12.38974       8.987843      14.28148
## x5109_b3_beta_c18neg_81        11.33230      10.583197      14.24202
## x5112_b3_beta_c18neg_56        12.17100      10.430688      14.90995
##                         352.0856_0.687 437.0542_0.688 462.1763_0.655
## x5107_b3_beta_c18neg_28       12.19208       11.59417       12.12562
## x5109_b3_beta_c18neg_81       13.44411       13.69906       13.46653
## x5112_b3_beta_c18neg_56       12.33612       12.14682       12.06409
##                         507.223_1.7 507.223_2.273 551.3582_4.841 557.457_6.865
## x5107_b3_beta_c18neg_28    15.82112      13.36222       15.04541      11.88666
## x5109_b3_beta_c18neg_81    16.10839      13.94255       14.21245      11.49448
## x5112_b3_beta_c18neg_56    15.89406      13.64799       14.45460      11.97055
##                         559.4719_6.867 577.3738_4.918 579.3893_5.557
## x5107_b3_beta_c18neg_28       11.90796       13.87389       14.01704
## x5109_b3_beta_c18neg_81       11.98511       13.66888       13.95120
## x5112_b3_beta_c18neg_56       12.29566       13.54795       13.40897
##                         591.3894_5.174 591.462_4.314 591.462_4.651
## x5107_b3_beta_c18neg_28       14.09410      12.10241      11.67833
## x5109_b3_beta_c18neg_81       13.69385      12.19859      11.83841
## x5112_b3_beta_c18neg_56       13.98307      12.07909      11.69268
##                         684.6065_10.853 794.5464_7.772 818.6271_10.414
## x5107_b3_beta_c18neg_28        18.13677       16.37619        14.97830
## x5109_b3_beta_c18neg_81        17.86967       15.88000        14.50881
## x5112_b3_beta_c18neg_56        18.15119       16.18453        14.68936
##                         819.6141_9.024 821.6139_9.026 827.6272_7.905
## x5107_b3_beta_c18neg_28       14.35328       13.00312       14.11301
## x5109_b3_beta_c18neg_81       13.86363       12.69708       13.59230
## x5112_b3_beta_c18neg_56       14.10297       12.95969       14.13292
##                         829.6432_9.024 831.6576_9.28 841.6406_8.452
## x5107_b3_beta_c18neg_28       16.79052      12.46298       12.79270
## x5109_b3_beta_c18neg_81       16.20519      12.29325       12.47057
## x5112_b3_beta_c18neg_56       16.42180      12.76196       12.78832
##                         843.6586_9.396 853.6428_8.12 857.6737_9.513
## x5107_b3_beta_c18neg_28       14.98839      13.31049       11.91099
## x5109_b3_beta_c18neg_81       14.43325      13.54001       11.49423
## x5112_b3_beta_c18neg_56       14.96732      13.58702       12.29627
##                         863.5644_9.582 871.6891_10.337 878.5903_7.305
## x5107_b3_beta_c18neg_28       14.15278        14.94652       13.50403
## x5109_b3_beta_c18neg_81       13.57718        14.86260       13.29179
## x5112_b3_beta_c18neg_56       13.52384        15.42354       13.60690
##                         881.6055_9.023 883.6211_9.976 887.5991_9.03
## x5107_b3_beta_c18neg_28       13.27430       13.67873      12.98071
## x5109_b3_beta_c18neg_81       12.90949       13.42718      12.51242
## x5112_b3_beta_c18neg_56       12.93948       13.42897      12.94346
##                         931.5514_9.582 939.6769_10.335
## x5107_b3_beta_c18neg_28       11.86885        12.68854
## x5109_b3_beta_c18neg_81       11.07676        12.44487
## x5112_b3_beta_c18neg_56       11.36730        13.06843
# pull metadata
metadata_Heatmap <- metadata

# change treatment to factor
metadata_Heatmap$treatment <- as.factor(metadata_Heatmap$treatment)

# make it so that rownames in metadata match rownames from heatmap df
rownames(metadata_Heatmap) <- rownames(ANOVA_trtperiod_heatmap_data)

# create annotation rows for treatment and wrangle
# select rownames (samples) from heatmap metadata (also ensures the order is correct)
anno_trt_row <- as.data.frame(rownames(metadata_Heatmap))

# pull trt column
anno_trt_row$treatment <- metadata_Heatmap$treatment
anno_trt_row$sex <- metadata_Heatmap$sex

# select trt
anno_trt_row <- anno_trt_row %>%
  dplyr::select(treatment, sex)

# get rownames to match heatmap again
rownames(anno_trt_row) <- rownames(metadata_Heatmap)
# create annotation colors
annotation_colors <- list(treatment = c("beta" = "orange",
                                        "control" = "green",
                                        "red" = "tomato"),
                          sex = c("M" = "burlywood",
                                  "F" = "pink"))
pheatmap(t(ANOVA_trtperiod_heatmap_data),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_trt_row,
           annotation_colors = annotation_colors,
           cluster_cols = TRUE,
           show_colnames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
           cutree_rows = 8,
           cutree_cols = 3,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of features significant in ANOVA across all treatment groups \nby Benjamoni-Hochberg corrected \np-values > 0.05 \nLipidomics C18 (-) \nShowing only post-intervention timepoints") 

# Without hierarchical clustering of samples (cols)
pheatmap(t(ANOVA_trtperiod_heatmap_data),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_trt_row,
           annotation_colors = annotation_colors,
           cluster_cols = FALSE,
           show_colnames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
           cutree_rows = 8,
           cutree_cols = 3,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of features significant in ANOVA across treatment groups \nby Benjamoni-Hochberg corrected \np-values > 0.05 \nLipidomics C18 (-) \nShowing only post-intervention timepoints") 

Unpaired

unpaired_t.tests_heatmap_data <- df_for_stats_wide %>%
  filter(period == "b3") %>%
  dplyr::select(sample, 
                all_of(sig_overlap_ctrl_beta$mz_rt),
                all_of(sig_overlap_ctrl_red$mz_rt),
                all_of(sig_overlap_tom_ctrl$mz_rt),
                all_of(sig_overlap_beta_red$mz_rt)) %>%
  column_to_rownames("sample")

head(unpaired_t.tests_heatmap_data,n = 3)
##                         1271.7465_5.862 1646.3475_10.439 557.4566_6.309
## x5107_b3_beta_c18neg_28        13.17066         11.59082       12.53121
## x5109_b3_beta_c18neg_81        12.69443         10.85874       12.40276
## x5112_b3_beta_c18neg_56        12.89604         11.55739       12.92316
##                         575.467_4.662 764.5548_6.543 767.5664_7.562
## x5107_b3_beta_c18neg_28      11.09816       13.46956       13.17776
## x5109_b3_beta_c18neg_81      11.20832       13.17250       12.96589
## x5112_b3_beta_c18neg_56      10.81837       13.59083       12.86548
##                         797.5117_5.847 819.6141_9.024 829.6432_9.024
## x5107_b3_beta_c18neg_28       13.91578       14.35328       16.79052
## x5109_b3_beta_c18neg_81       13.51247       13.86363       16.20519
## x5112_b3_beta_c18neg_56       13.63163       14.10297       16.42180
##                         833.6297_9.665 843.6587_9.666 847.6455_10.298
## x5107_b3_beta_c18neg_28       13.78397       15.71573        15.55911
## x5109_b3_beta_c18neg_81       13.44514       15.19044        15.26548
## x5112_b3_beta_c18neg_56       13.63559       15.45538        15.33875
##                         853.6428_8.12 855.6591_9.033 857.6746_10.294
## x5107_b3_beta_c18neg_28      13.31049       17.38560        17.24798
## x5109_b3_beta_c18neg_81      13.54001       16.73622        16.68291
## x5112_b3_beta_c18neg_56      13.58702       17.22952        16.89029
##                         869.598_7.834 886.5199_7.016 890.5493_8.144
## x5107_b3_beta_c18neg_28      12.79628       12.77818       13.58262
## x5109_b3_beta_c18neg_81      12.62707       13.02092       13.32260
## x5112_b3_beta_c18neg_56      12.19584       12.90366       13.57013
##                         895.6211_9.665 903.5878_9.033 907.6211_9.035
## x5107_b3_beta_c18neg_28       12.76520       12.38543       13.72623
## x5109_b3_beta_c18neg_81       12.22281       12.16643       13.40179
## x5112_b3_beta_c18neg_56       12.78374       12.40267       13.68643
##                         911.6459_9.666 913.6162_9.035 923.646_9.035
## x5107_b3_beta_c18neg_28       13.62686       13.41607      14.85786
## x5109_b3_beta_c18neg_81       13.23490       13.14782      14.44927
## x5112_b3_beta_c18neg_56       13.29647       13.34383      14.79689
##                         945.6385_9.975 985.616_9.034 244.908_0.706
## x5107_b3_beta_c18neg_28       12.33899      13.17591      14.28148
## x5109_b3_beta_c18neg_81       12.12268      12.58536      14.24202
## x5112_b3_beta_c18neg_56       12.11486      13.00376      14.90995
##                         705.5178_5.308 711.5035_5.685 526.3144_2.683
## x5107_b3_beta_c18neg_28       12.77114       13.34210       14.23104
## x5109_b3_beta_c18neg_81       12.15313       12.85181       14.24883
## x5112_b3_beta_c18neg_56       12.91117       13.14473       14.13615
##                         821.6139_9.026 835.6457_10.444 915.6327_10.293
## x5107_b3_beta_c18neg_28       13.00312        16.81563        13.85985
## x5109_b3_beta_c18neg_81       12.69708        16.53929        13.31377
## x5112_b3_beta_c18neg_56       12.95969        16.76968        13.65187
##                         924.518_7.766 971.6542_9.988 559.4719_6.867
## x5107_b3_beta_c18neg_28      12.89559       12.88359       11.90796
## x5109_b3_beta_c18neg_81      13.11896       12.54816       11.98511
## x5112_b3_beta_c18neg_56      13.20034       12.81446       12.29566
##                         591.462_4.314 818.6271_10.414 853.619_10.659
## x5107_b3_beta_c18neg_28      12.10241        14.97830       11.82644
## x5109_b3_beta_c18neg_81      12.19859        14.50881       11.56742
## x5112_b3_beta_c18neg_56      12.07909        14.68936       11.96410
pheatmap(t(unpaired_t.tests_heatmap_data),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_trt_row,
           annotation_colors = annotation_colors,
           cluster_cols = TRUE,
           show_colnames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
         cutree_rows = 8,
         cutree_cols = 3,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of features significant in all unpaired t-test comparisons that overlap with sig ANOVA features across all treatment groups \nby Benjamoni-Hochberg corrected \np-values > 0.05 \nLipidomics C18 (-)")

# without clustering of cols
pheatmap(t(unpaired_t.tests_heatmap_data),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_trt_row,
           annotation_colors = annotation_colors,
           cluster_cols = FALSE,
           show_colnames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
         cutree_rows = 8,
         cutree_cols = 3,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of features significant in all unpaired t-test comparisons that overlap with sig ANOVA features across all treatment groups \nby Benjamoni-Hochberg corrected \np-values > 0.05 \nLipidomics C18 (-)")

Paired

Red
red_paired_t.tests_heatmap_data <- df_for_stats_wide %>%
  filter(treatment == "red") %>%
  dplyr::select(sample, period, treatment, sex,
                all_of(red_sig_ANOVA_overlap_paired$mz_rt)) %>%
  mutate_at("period", as.factor) %>%
  column_to_rownames("sample")
# create annotation rows for pre/post interventions and wrangle
# select rownames (samples) from heatmap metadata (also ensures the order is correct)
anno_red_row_paired <- as.data.frame(rownames(red_paired_t.tests_heatmap_data))


# pull period into a column
anno_red_row_paired$period <- red_paired_t.tests_heatmap_data$period
anno_red_row_paired$sex <- red_paired_t.tests_heatmap_data$sex

# select cols
anno_red_row_paired <- anno_red_row_paired %>%
  dplyr::select(period, sex)

# get rownames to match heatmap again
rownames(anno_red_row_paired) <- rownames(red_paired_t.tests_heatmap_data)
# create annotation colors
red_annotation_colors <- list(period = c("b1" = "darksalmon",
                                        "b3" = "red"),
                              sex = c("M" = "aquamarine2",
                                      "F" = "pink"))
pheatmap(t(red_paired_t.tests_heatmap_data[,-c(1:3)]),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_red_row_paired,
           annotation_colors = red_annotation_colors,
           cluster_cols = TRUE,
           show_rownames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
           cutree_rows = 8,
         cutree_cols = 2,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of significant features pre- vs. post-High-Lyc paired t-test \nsig in ANOVA across all treatment groups \nby Benjamoni-Hochberg corrected p-values > 0.05 \nBackground diet effect removed \nLipidomics C18 (-)")

Beta
beta_paired_t.tests_heatmap_data <- df_for_stats_wide %>%
  filter(treatment == "beta") %>%
  dplyr::select(sample, period, treatment, sex,
                all_of(beta_sig_ANOVA_overlap_paired$mz_rt)) %>%
  mutate_at("period", as.factor) %>%
  column_to_rownames("sample")
# create annotation rows for pre/post interventions and wrangle
# select rownames (samples) from heatmap metadata (also ensures the order is correct)
anno_beta_row_paired <- as.data.frame(rownames(beta_paired_t.tests_heatmap_data))


# pull period into a column
anno_beta_row_paired$period <- beta_paired_t.tests_heatmap_data$period
anno_beta_row_paired$sex <- beta_paired_t.tests_heatmap_data$sex

# select cols
anno_beta_row_paired <- anno_beta_row_paired %>%
  dplyr::select(sex, period)

# get rownames to match heatmap again
rownames(anno_beta_row_paired) <- rownames(beta_paired_t.tests_heatmap_data)
# create annotation colors
beta_annotation_colors <- list(period = c("b1" = "bisque",
                                        "b3" = "darkorange"),
                              sex = c("M" = "aquamarine2",
                                      "F" = "pink"))
pheatmap(t(beta_paired_t.tests_heatmap_data[,-c(1:3)]),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_beta_row_paired,
           annotation_colors = beta_annotation_colors,
           cluster_cols = TRUE,
           show_rownames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
           cutree_rows = 10,
         cutree_cols = 5,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of significant features pre- vs. post-High-beta paired t-test \nsig in ANOVA across all treatment groups \nby Benjamoni-Hochberg corrected p-values > 0.05 \nBackground diet effect removed \nLipidomics C18 (+)")

Tomato
tom_paired_t.tests_heatmap_data <- df_for_stats_wide %>%
  filter(treatment != "control") %>%
  dplyr::select(sample, period, tomato_or_control, sex,
                all_of(tom_sig_ANOVA_overlap_paired$mz_rt)) %>%
  mutate_at("period", as.factor) %>%
  column_to_rownames("sample")
# create annotation rows for pre/post interventions and wrangle
# select rownames (samples) from heatmap metadata (also ensures the order is correct)
anno_tom_row_paired <- as.data.frame(rownames(tom_paired_t.tests_heatmap_data))


# pull period into a column
anno_tom_row_paired$period <- tom_paired_t.tests_heatmap_data$period
anno_tom_row_paired$sex <- tom_paired_t.tests_heatmap_data$sex

# select cols
anno_tom_row_paired <- anno_tom_row_paired %>%
  dplyr::select(period, sex)

# get rownames to match heatmap again
rownames(anno_tom_row_paired) <- rownames(tom_paired_t.tests_heatmap_data)
# create annotation colors
tom_annotation_colors <- list(period = c("b1" = "darksalmon",
                                        "b3" = "tomato"),
                              sex = c("M" = "aquamarine2",
                                      "F" = "pink"))
pheatmap(t(tom_paired_t.tests_heatmap_data[,-c(1:3)]),
           scale = "row",
           cluster_rows = TRUE,
           annotation_col = anno_tom_row_paired,
           annotation_colors = tom_annotation_colors,
           cluster_cols = TRUE,
           show_rownames = TRUE,
           clustering_distance_rows = "euclidean",
           clustering_distance_cols = "euclidean",
           cutree_rows = 8,
         cutree_cols = 2,
           clustering_method = "ward.D2",
           color = colorRampPalette(c("#67a9cf", "#f7f7f7", "#ef8a62"))(16),
           main = "Heatmap of significant features pre- vs. post-Tomato paired t-test \nsig in ANOVA across all treatment groups \nby Benjamoni-Hochberg corrected p-values > 0.05 \nBackground diet effect removed \nLipidomics C18 (+)")

Joined lists

df_for_stats <- df_for_stats %>%
  # add rel abund levels back since this got lost during drift correction
  mutate(rel_abund = 2^(rel_abund_log2))

Using t tests sig

Tomato effects

How many features are significant (with background diet effect removed)

dim(sig_paired_tom_rmBG)
## [1] 219  20

Which features are significant in unpaired t test comparisons?

# select only significant features from pre v post tomato effect that have a matching key to significant features post tomato v. post control comparison

overall_tomato_effect <- semi_join(sig_paired_tom_rmBG,
                                   sig_tom_v_ctrl_t.test,
                                  by = "mz_rt")

dim(overall_tomato_effect)
## [1]  9 20

Summary stats

(FC_tomato_effect <- df_for_stats %>%
  filter(mz_rt %in% overall_tomato_effect$mz_rt) %>%
  select(subject, treatment_period, mz_rt, rel_abund) %>%
  group_by(mz_rt) %>%
  pivot_wider(names_from = treatment_period,
              values_from = rel_abund) %>%
  mutate(control_FC = control_b3/control_b1,
         beta_FC = beta_b3/beta_b1,
         red_FC = red_b3/red_b1) %>%
  summarize(mean_control_FC = mean(control_FC, na.rm = TRUE),
            mean_beta_FC = mean(beta_FC, na.rm = TRUE),
            mean_red_FC = mean(red_FC, na.rm = TRUE),
            mean_ctrl_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_ctrl_red_FC = mean(mean(red_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_red_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(red_FC, na.rm = TRUE))))
## # A tibble: 9 × 7
##   mz_rt           mean_control_FC mean_beta_FC mean_red_FC mean_ctrl_beta_FC
##   <chr>                     <dbl>        <dbl>       <dbl>             <dbl>
## 1 244.908_0.706             1.07         1.08        1.08              1.00 
## 2 526.3144_2.683            1.15         1.23        1.09              1.07 
## 3 847.6455_10.298           0.913        0.857       0.927             0.938
## 4 907.6211_9.035            1.10         1.12        1.11              1.01 
## 5 915.6327_10.293           0.917        0.895       0.884             0.975
## 6 945.5095_6.552            1.05         0.941       0.965             0.898
## 7 945.6385_9.975            1.02         0.853       0.924             0.836
## 8 967.6322_9.976            0.980        0.873       0.903             0.891
## 9 991.6331_9.034            1.15         1.11        1.11              0.964
## # ℹ 2 more variables: mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>

Compile list

# combine cluster and FC info
tom_effect_list <- left_join(FC_tomato_effect, 
                             cluster_features,
                             by = "mz_rt") %>%
  select(mz_rt, mz, rt, Cluster_ID, Cluster_features, Cluster_size, everything())
# add in averages for each group + timepoint
tom_effect_list <-
  left_join(tom_effect_list,
            (df_for_stats %>%
               group_by(treatment_period, mz_rt) %>%
               summarize(mean_rel_abund = mean(rel_abund)) %>%
               pivot_wider(names_from = treatment_period, values_from = mean_rel_abund)),
            by = "mz_rt")

head(tom_effect_list, n=1)
## # A tibble: 1 × 19
##   mz_rt        mz    rt Cluster_ID Cluster_features Cluster_size mean_control_FC
##   <chr>     <dbl> <dbl> <chr>      <chr>                   <dbl>           <dbl>
## 1 244.908_…  245. 0.706 Cluster_2… 244.908_0.706;2…            2            1.07
## # ℹ 12 more variables: mean_beta_FC <dbl>, mean_red_FC <dbl>,
## #   mean_ctrl_beta_FC <dbl>, mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>,
## #   MPA <dbl>, beta_b1 <dbl>, beta_b3 <dbl>, control_b1 <dbl>,
## #   control_b3 <dbl>, red_b1 <dbl>, red_b3 <dbl>

Export list

write_csv(tom_effect_list, "effect lists/tomato-effect.csv")

Boxplots

# make comparison list for comparison tests
my_comparisons <- list( c("beta_b1", "beta_b3"), 
                        c("red_b1", "red_b3"),
                        c("control_b1", "control_b3") )
# subset df for uniquely significant features
justT_tom_effect_df <- df_for_stats_wide %>%
  dplyr::select(c(1:21),
                (all_of(overall_tomato_effect$mz_rt)))

# make tidy df
justT_tom_effect_df_tidy <- justT_tom_effect_df %>%
  pivot_longer(cols = 22:ncol(.),
               names_to = "mz_rt",
               values_to = "rel_abund_log2")
# fix factor levels for time points
justT_tom_effect_df_tidy$treatment_period <- factor(justT_tom_effect_df_tidy$treatment_period,
                              levels = c("control_b1", "control_b3", 
                                         "beta_b1", "beta_b3",
                                         "red_b1", "red_b3"))

# check
levels(justT_tom_effect_df_tidy$treatment_period)  
## [1] "control_b1" "control_b3" "beta_b1"    "beta_b3"    "red_b1"    
## [6] "red_b3"
justT_tom_effect_df_tidy$treatment <- factor(justT_tom_effect_df_tidy$treatment,
                              levels = c("control", "beta", "red"))
justT_tom_effect_df_tidy %>% 
  ggplot(aes(x = treatment_period, y = rel_abund_log2, fill = treatment_period)) +
  geom_boxplot() +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan", "orangered2",
                               "lavenderblush3", "darkred"),
                    labels = c("pre control", "post control",
                               "pre beta", "post beta",
                               "pre lyc", "post lyc")) +
  scale_x_discrete(labels = c("", "", "", "", "", "")) +
  geom_line(aes(group = subject, colour = subject), size = 0.2) +
  theme_classic(base_size = 12, base_family = "sans") +
  facet_wrap(vars(mz_rt), scales = "free_y", ncol = 4) + 
  stat_compare_means(comparisons = my_comparisons, method = "t.test", paired = TRUE, p.adjust.method = "BH") +
  labs(x = "",
       y = "Log2 transformed relative abundance",
       title = "Tomato effect - significant when compared to control, also significant pre and post tomato",
       subtitle = "FDR adj. p-values from T-tests")

Beta effects

dim(sig_paired_beta_rmBG)
## [1] 167  20

Which features are significant in paired t test comparisons for beta, but not significant in the same direction for control?

Features that are significant in both pre- vs. post. beta AND post-beta vs. post-control

# select features that are only significant post beta v. post control comparison
overall_beta_effect <- semi_join(sig_paired_beta_rmBG,
                                 sig_beta_v_ctrl_t.test,
                                 by = "mz_rt")
dim(overall_beta_effect)
## [1]  5 20
overall_unique_beta_effect <- left_join(overall_beta_effect,
                                        sig_beta_v_red_t.test,
                                        by = "mz_rt")
dim(overall_unique_beta_effect)
## [1]  5 29

Summary stats

(FC_beta_effect <- df_for_stats %>%
  filter(mz_rt %in% overall_beta_effect$mz_rt) %>%
  select(subject, treatment_period, mz_rt, rel_abund) %>%
  group_by(mz_rt) %>%
  pivot_wider(names_from = treatment_period,
              values_from = rel_abund) %>%
  mutate(control_FC = control_b3/control_b1,
         beta_FC = beta_b3/beta_b1,
         red_FC = red_b3/red_b1) %>%
  summarize(mean_control_FC = mean(control_FC, na.rm = TRUE),
            mean_beta_FC = mean(beta_FC, na.rm = TRUE),
            mean_red_FC = mean(red_FC, na.rm = TRUE),
            mean_ctrl_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_ctrl_red_FC = mean(mean(red_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_red_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(red_FC, na.rm = TRUE))))
## # A tibble: 5 × 7
##   mz_rt           mean_control_FC mean_beta_FC mean_red_FC mean_ctrl_beta_FC
##   <chr>                     <dbl>        <dbl>       <dbl>             <dbl>
## 1 847.6455_10.298           0.913        0.857       0.927             0.938
## 2 896.6737_10.623           0.997        0.861       0.936             0.863
## 3 917.633_10.292            1.01         0.891       0.980             0.886
## 4 945.6385_9.975            1.02         0.853       0.924             0.836
## 5 967.6322_9.976            0.980        0.873       0.903             0.891
## # ℹ 2 more variables: mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>

Compile list

# combine cluster and FC info
beta_effect_list <- left_join(FC_beta_effect, 
                              cluster_features,
                              by = "mz_rt") %>%
  select(mz_rt, mz, rt, Cluster_ID, Cluster_features, Cluster_size, everything())
# add in averages for each group + timepoint
beta_effect_list <-
  left_join(beta_effect_list,
            (df_for_stats %>%
               group_by(treatment_period, mz_rt) %>%
               summarize(mean_rel_abund = mean(rel_abund)) %>%
               pivot_wider(names_from = treatment_period, values_from = mean_rel_abund)),
            by = "mz_rt")

head(beta_effect_list, n=1)
## # A tibble: 1 × 19
##   mz_rt        mz    rt Cluster_ID Cluster_features Cluster_size mean_control_FC
##   <chr>     <dbl> <dbl> <chr>      <chr>                   <dbl>           <dbl>
## 1 847.6455…  848.  10.3 847.6455_… 847.6455_10.298             1           0.913
## # ℹ 12 more variables: mean_beta_FC <dbl>, mean_red_FC <dbl>,
## #   mean_ctrl_beta_FC <dbl>, mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>,
## #   MPA <dbl>, beta_b1 <dbl>, beta_b3 <dbl>, control_b1 <dbl>,
## #   control_b3 <dbl>, red_b1 <dbl>, red_b3 <dbl>

Export list

write_csv(beta_effect_list, "effect lists/beta-effect.csv")

Boxplots

# subset df for uniquely significant features
justT_beta_effect_df <- df_for_stats_wide %>%
  dplyr::select(c(1:21),
                (all_of(overall_beta_effect$mz_rt)))

# make tidy df
justT_beta_effect_df_tidy <- justT_beta_effect_df %>%
  pivot_longer(cols = 22:ncol(.),
               names_to = "mz_rt",
               values_to = "rel_abund_log2")
# fix factor levels for time points
justT_beta_effect_df_tidy$treatment_period <- factor(justT_beta_effect_df_tidy$treatment_period,
                              levels = c("control_b1", "control_b3", 
                                         "beta_b1", "beta_b3",
                                         "red_b1", "red_b3"))

# check
levels(justT_beta_effect_df_tidy$treatment_period)  
## [1] "control_b1" "control_b3" "beta_b1"    "beta_b3"    "red_b1"    
## [6] "red_b3"
justT_beta_effect_df_tidy$treatment <- factor(justT_beta_effect_df_tidy$treatment,
                              levels = c("control", "beta", "red"))
justT_beta_effect_df_tidy %>% 
  ggplot(aes(x = treatment_period, y = rel_abund_log2, fill = treatment_period)) +
  geom_boxplot() +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan", "orangered2",
                               "lavenderblush3", "darkred"),
                    labels = c("pre control", "post control",
                               "pre beta", "post beta",
                               "pre lyc", "post lyc")) +
  scale_x_discrete(labels = c("", "", "", "", "", "")) +
  geom_line(aes(group = subject, colour = subject), size = 0.2) +
  theme_classic(base_size = 12, base_family = "sans") +
  facet_wrap(vars(mz_rt), scales = "free_y", nrow = 3) + 
  stat_compare_means(comparisons = my_comparisons, method = "t.test", paired = TRUE, p.adjust.method = "BH") +
  labs(x = "",
       y = "Log2 transformed relative abundance",
       title = "High beta juice effect - significant when compared to control, also significant pre and post beta juice",
       subtitle = "FDR adj. p-values from T-tests")

Red effects

dim(sig_paired_red_rmBG)
## [1] 95 20
# select features that are only significant post red v. post control comparison

overall_red_effect <- semi_join(sig_paired_red_rmBG,
                                 sig_red_v_ctrl_t.test,
                                  by = "mz_rt")
dim(overall_red_effect)
## [1]  1 20
# select features that are only significant post tomato v. post control comparison

overall_unique_red_effect <- left_join(overall_red_effect,
                                        sig_beta_v_red_t.test,
                                        by = "mz_rt")
dim(overall_unique_red_effect)
## [1]  1 29
head(overall_unique_red_effect)
## # A tibble: 1 × 29
##   mz_rt  .y..red group1.red group2.red n1.red n2.red statistic.red df.red  p.red
##   <chr>  <chr>   <chr>      <chr>       <int>  <int>         <dbl>  <dbl>  <dbl>
## 1 945.6… rel_ab… b1         b3             12     12          2.33     11 0.0396
## # ℹ 20 more variables: p.signif.red <chr>, .y..ctrl <chr>, group1.ctrl <chr>,
## #   group2.ctrl <chr>, n1.ctrl <int>, n2.ctrl <int>, statistic.ctrl <dbl>,
## #   df.ctrl <dbl>, p.ctrl <dbl>, p.signif.ctrl <chr>, sign <dbl>, .y. <chr>,
## #   group1 <chr>, group2 <chr>, n1 <int>, n2 <int>, statistic <dbl>, df <dbl>,
## #   p <dbl>, p.signif <chr>

Summary stats

(FC_red_effect <- df_for_stats %>%
  filter(mz_rt %in% overall_red_effect$mz_rt) %>%
  select(subject, treatment_period, mz_rt, rel_abund) %>%
  group_by(mz_rt) %>%
  pivot_wider(names_from = treatment_period,
              values_from = rel_abund) %>%
  mutate(control_FC = control_b3/control_b1,
         beta_FC = beta_b3/beta_b1,
         red_FC = red_b3/red_b1) %>%
  summarize(mean_control_FC = mean(control_FC, na.rm = TRUE),
            mean_beta_FC = mean(beta_FC, na.rm = TRUE),
            mean_red_FC = mean(red_FC, na.rm = TRUE),
            mean_ctrl_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_ctrl_red_FC = mean(mean(red_FC, na.rm = TRUE)/mean(control_FC, na.rm = TRUE)),
            mean_red_beta_FC = mean(mean(beta_FC, na.rm = TRUE)/mean(red_FC, na.rm = TRUE))))
## # A tibble: 1 × 7
##   mz_rt          mean_control_FC mean_beta_FC mean_red_FC mean_ctrl_beta_FC
##   <chr>                    <dbl>        <dbl>       <dbl>             <dbl>
## 1 945.6385_9.975            1.02        0.853       0.924             0.836
## # ℹ 2 more variables: mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>

Compile list

# combine cluster and FC info
red_effect_list <- left_join(FC_red_effect, 
                             cluster_features,
                             by = "mz_rt") %>%
  select(mz_rt, mz, rt, Cluster_ID, Cluster_features, Cluster_size, everything())
# add in averages for each group + timepoint
red_effect_list <-
  left_join(red_effect_list,
            (df_for_stats %>%
               group_by(treatment_period, mz_rt) %>%
               summarize(mean_rel_abund = mean(rel_abund)) %>%
               pivot_wider(names_from = treatment_period, values_from = mean_rel_abund)),
            by = "mz_rt")

head(red_effect_list, n=1)
## # A tibble: 1 × 19
##   mz_rt        mz    rt Cluster_ID Cluster_features Cluster_size mean_control_FC
##   <chr>     <dbl> <dbl> <chr>      <chr>                   <dbl>           <dbl>
## 1 945.6385…  946.  9.98 945.6385_… 945.6385_9.975              1            1.02
## # ℹ 12 more variables: mean_beta_FC <dbl>, mean_red_FC <dbl>,
## #   mean_ctrl_beta_FC <dbl>, mean_ctrl_red_FC <dbl>, mean_red_beta_FC <dbl>,
## #   MPA <dbl>, beta_b1 <dbl>, beta_b3 <dbl>, control_b1 <dbl>,
## #   control_b3 <dbl>, red_b1 <dbl>, red_b3 <dbl>

Export list

write_csv(red_effect_list, "effect lists/red-effect.csv")

Boxplots

# subset df for uniquely significant features
justT_red_effect_df <- df_for_stats_wide %>%
  dplyr::select(c(1:21),
                (all_of(overall_unique_red_effect$mz_rt)))

# make tidy df
justT_red_effect_df_tidy <- justT_red_effect_df %>%
  pivot_longer(cols = 22:ncol(.),
               names_to = "mz_rt",
               values_to = "rel_abund_log2")
# fix factor levels for time points
justT_red_effect_df_tidy$treatment_period <- factor(justT_red_effect_df_tidy$treatment_period,
                              levels = c("control_b1", "control_b3", 
                                         "beta_b1", "beta_b3",
                                         "red_b1", "red_b3"))

# check
levels(justT_red_effect_df_tidy$treatment_period)  
## [1] "control_b1" "control_b3" "beta_b1"    "beta_b3"    "red_b1"    
## [6] "red_b3"
justT_red_effect_df_tidy$treatment <- factor(justT_red_effect_df_tidy$treatment,
                              levels = c("control", "beta", "red"))
justT_red_effect_df_tidy %>% 
  ggplot(aes(x = treatment_period, y = rel_abund_log2, fill = treatment_period)) +
  geom_boxplot() +
  scale_fill_manual(values = c("darkseagreen2", "darkgreen", 
                               "tan", "orangered2",
                               "lavenderblush3", "darkred"),
                    labels = c("pre control", "post control",
                               "pre beta", "post beta",
                               "pre lyc", "post lyc")) +
  scale_x_discrete(labels = c("", "", "", "", "", "")) +
  geom_line(aes(group = subject, colour = subject), size = 0.2) +
  theme_classic(base_size = 12, base_family = "sans") +
  facet_wrap(vars(mz_rt), scales = "free_y") + 
  stat_compare_means(comparisons = my_comparisons, method = "t.test", paired = TRUE, p.adjust.method = "BH") +
  labs(x = "",
       y = "Log2 transformed relative abundance",
       title = "High lyc effect - significant when compared to control, \nsignificant pre vs post red",
       subtitle = "FDR adj. p-values from T-tests")

Export

Metabolite df

write_csv(DC_imp_metabind_clust_log2_noQCs, "final-omics-df-lipidomics-neg.csv",col_names = TRUE)
LS0tCnRpdGxlOiAiYmxvb2QgcGxhc21hIGxpcGlkb21pY3MgLSBEYXRhIGFuYWx5c2lzICgtKSIKYXV0aG9yOiAiTWFyaWEgU2hvbG9sYSIKZGF0ZTogIjIwMjQtMDgtMDEgYW5kIHNvIG9uIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBoaWdobGlnaHQ6IGthdGUKICAgIHRoZW1lOiB5ZXRpCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2RlcHRoOiA1CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDcKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0gCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobz1UUlVFKSAKYGBgCgojIExvYWQgbGlicmFyaWVzCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShyZWFkeGwpICMgZm9yIHJlYWRpbmcgaW4gZXhjZWwgZmlsZXMKbGlicmFyeShqYW5pdG9yKSAjIGRhdGEgY2hlY2tzIGFuZCBjbGVhbmluZwpsaWJyYXJ5KGdsdWUpICMgZm9yIGVhc3kgcGFzdGluZwpsaWJyYXJ5KEZhY3RvTWluZVIpICMgZm9yIFBDQQpsaWJyYXJ5KGZhY3RvZXh0cmEpICMgZm9yIFBDQQpsaWJyYXJ5KHJzdGF0aXgpICMgZm9yIHN0YXRzCmxpYnJhcnkocGhlYXRtYXApICMgZm9yIGhlYXRtYXBzCmxpYnJhcnkocGxvdGx5KSAjIGZvciBpbnRlcmFjdGl2ZSBwbG90cwpsaWJyYXJ5KGh0bWx3aWRnZXRzKSAjIGZvciBzYXZpbmcgaW50ZXJhY3RpdmUgcGxvdHMKbGlicmFyeShkZXZ0b29scykKbGlicmFyeShub3RhbWUpICMgdXNlZCBmb3IgZmVhdHVyZSBjbHVzdGVyaW5nCmxpYnJhcnkoZG9QYXJhbGxlbCkKbGlicmFyeShpZ3JhcGgpICMgZmVhdHVyZSBjbHVzdGVyaW5nCmxpYnJhcnkoZ2dwdWJyKSAjIHZpc3VhbGl6YXRpb25zCmxpYnJhcnkoa25pdHIpICMgY2xlYW4gdGFibGUgcHJpbnRpbmcKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoY29ycnIpCmxpYnJhcnkoZ2djb3JycGxvdCkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkoUENBdG9vbHMpCmxpYnJhcnkocGF0aHZpZXcpICMgZm9yIGZ1bmN0aW9uYWwgYW5hbHlzaXMgYW5kIEtFR0cgYW5ub3RhdGlvbgpsaWJyYXJ5KG1peE9taWNzKSAjbXVsdGlsZXZlbCBQQ0EgYW5kIHNQTFMtREEKbGlicmFyeSh0aWR5dmVyc2UpICMgZm9yIGV2ZXJ5dGhpbmcKYGBgCgojIFJlYWQgaW4gZGF0YQpgYGB7cn0KIyByYXcgZmlsdGVyZWQgbWV0YWJvbG9taWNzIGRhdGEgCm9taWNzZGF0YSA8LSByZWFkX2NzdigiZmVhdHVyZXNfcG9zdC1kYXRhLWZpbHRlcmluZy5jc3YiKSAlPiUKICBjbGVhbl9uYW1lcygpCgojIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWRfY3N2KCIuLi8uLi8uLi9tZXRhZGF0YS1uZXcuY3N2IikKCiMgY2Fyb3Rlbm9pZHMgZGF0YQpjYXJvdGVub2lkcyA8LSByZWFkX2V4Y2VsKCIuLi8uLi8uLi9QbGFzbWEgY2Fyb3RfcmV0X2FwbyBsZXZlbHMueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQjFhbmRCMyIpICU+JQogIGNsZWFuX25hbWVzKCkKYGBgCgoKIyBXcmFuZ2xlIGRhdGEKCiMjIE1ldGFkYXRhCgpgYGB7cn0KY2Fyb3Rlbm9pZHMgPC0gY2Fyb3Rlbm9pZHMgJT4lCiAgbXV0YXRlKHRvdGFsX2Nhcm90ZW5vaWRzID0gYl9jX25tb2xfbF9wbGFzbWEgKyBseWNfbm1vbF9sX3BsYXNtYSArIHJldGlub2xfbm1vbF9sX3BsYXNtYSArIGFwbzEzb25lX25tb2xfbF9wbGFzbWEpCmBgYAoKIyMgRmVhdHVyZSBkYXRhCgpgYGB7cn0KIyBob3cgbWFueSBmZWF0dXJlcwpucm93KG9taWNzZGF0YSkKYGBgCgpgYGB7cn0KIyBhcmUgdGhlcmUgYW55IGR1cGxpY2F0ZXM/Cm9taWNzZGF0YSAlPiUgZ2V0X2R1cGVzKG16X3J0KQpgYGAKCgpgYGB7cn0KIyByZW1vdmUgZHVwZXMKb21pY3NkYXRhIDwtIG9taWNzZGF0YSAlPiUgCiAgZGlzdGluY3QobXpfcnQsIC5rZWVwX2FsbCA9IFRSVUUpCgojIGNoZWNrIGFnYWluIGZvciBkdXBlcwpvbWljc2RhdGEgJT4lIGdldF9kdXBlcyhtel9ydCkKCiMgaG93IG1hbnkgZmVhdHVyZXMKbnJvdyhvbWljc2RhdGEpCmBgYAoKClNvbWV0aW1lcyBhIHdlaXJkIGxvZ2ljYWwgY29sdW1uIChsZ2wpIGNvbWVzIHVwIGluIG15IGRhdGEuIExldCdzIGNoZWNrIGlmIGl0J3MgdGhlcmUKCmBgYHtyfQpjb2xuYW1lcyhvbWljc2RhdGEpCmBgYAoKYGBge3J9CiMgcmVtb3ZlIGxnbCBjb2x1bW4Kb21pY3NkYXRhIDwtIG9taWNzZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KCF3aGVyZShpcy5sb2dpY2FsKSkgCgpjb2xuYW1lcyhvbWljc2RhdGEpCmBgYAoKIyMjIFRpZHkKCmBgYHtyfQojIGNyZWF0ZSBsb25nIGRmIGZvciBvbWljcyBkZgpvbWljc2RhdGFfdGlkeSA8LSBvbWljc2RhdGEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAzOm5jb2woLiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNhbXBsZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwZWFrX2hlaWdodCIpICU+JQogIG11dGF0ZShzYW1wbGUyID0gc2FtcGxlKSAlPiUKICAjIGFkZCBhIG5ldyBjb2x1bW4gd2l0aCBqdXN0IHN1YmplY3QKICByZW5hbWUoInN1YmplY3QiID0gc2FtcGxlMikgJT4lCiAgIyByZW1vdmUgdGhlIHN1ZmZpeCBmcm9tIHN1YmplY3QgbmFtZXMKICBtdXRhdGVfYXQoInN1YmplY3QiLCBzdHJfc3ViLCBzdGFydD0yLCBlbmQ9NSkKICAKYGBgCgojIyBDb21iaW5lIGRmcwoKYGBge3IsIGVjaG89RkFMU0V9Cm1ldGFkYXRhJHN1YmplY3QgPC0gYXMuY2hhcmFjdGVyKG1ldGFkYXRhJHN1YmplY3QpCgojIGNvbWJpbmUgbWV0YSBhbmQgb21pY3MgZGZzCm1ldGFfb21pY3MgPC0gZnVsbF9qb2luKG9taWNzZGF0YV90aWR5LAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJzdWJqZWN0IikKCiMgc2VwYXJhdGUgbXogYW5kIHJ0Cm1ldGFfb21pY3Nfc2VwIDwtIG1ldGFfb21pY3MgJT4lCiAgc2VwYXJhdGUoY29sID0gbXpfcnQsCiAgICAgICAgICAgaW50byA9IGMoIm16IiwgInJ0IiksCiAgICAgICAgICAgc2VwID0gIl8iKSAKCiMgY29udmVydCBjb2x1bW5zIHRvIGNvcnJlY3QgdHlwZQptZXRhX29taWNzX3NlcCRteiA8LSBhcy5udW1lcmljKG1ldGFfb21pY3Nfc2VwJG16KQptZXRhX29taWNzX3NlcCRydCA8LSBhcy5udW1lcmljKG1ldGFfb21pY3Nfc2VwJHJ0KQptZXRhX29taWNzX3NlcCRzdWJqZWN0IDwtIGFzLmNoYXJhY3RlcihtZXRhX29taWNzX3NlcCRzdWJqZWN0KQoKIyByZWFycmFuZ2UgY29sdW1uIG9yZGVyCm1ldGFfb21pY3Nfc2VwIDwtIG1ldGFfb21pY3Nfc2VwICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdCwgc2FtcGxlLCB0cmVhdG1lbnQsIHRvbWF0b19vcl9jb250cm9sLCBldmVyeXRoaW5nKCkpCgpzdHIobWV0YV9vbWljc19zZXApCmBgYAoKCmBgYHtyfQojIHJlcGxhY2UgTkEncyBpbiBjZXJ0YWluIGNvbHVtbnMgd2l0aCBRQwptZXRhX29taWNzX3NlcCRzdWJqZWN0IDwtIHN0cl9yZXBsYWNlX2FsbChtZXRhX29taWNzX3NlcCRzdWJqZWN0LCAiYyIsICJxYyIpCiAgCgptZXRhX29taWNzX3NlcCRzYW1wbGUgPC0gbWV0YV9vbWljc19zZXAkc2FtcGxlICU+JQogIHJlcGxhY2VfbmEoIlFDIikKCm1ldGFfb21pY3Nfc2VwJHRyZWF0bWVudCA8LSBtZXRhX29taWNzX3NlcCR0cmVhdG1lbnQgJT4lCiAgcmVwbGFjZV9uYSgiUUMiKQoKbWV0YV9vbWljc19zZXAkdG9tYXRvX29yX2NvbnRyb2wgPC0gbWV0YV9vbWljc19zZXAkdG9tYXRvX29yX2NvbnRyb2wgJT4lCiAgcmVwbGFjZV9uYSgiUUMiKQpgYGAKCiMgRGF0YSBzdW1tYXJpZXMKCiMjIE51bWJlciBvZiBtYXNzZXMgZGV0ZWN0ZWQKYGBge3J9Cm5yb3cob21pY3NkYXRhKQpgYGAKCiMjIE1hc3MgcmFuZ2UgZm9yIG1ldGFib2xpdGVzIGRldGVjdGVkPwpgYGB7cn0KcmFuZ2UobWV0YV9vbWljc19zZXAkbXopCmBgYAoKIyMgUlQgcmFuZ2UgZm9yIG1ldGFib2xpdGVzIGRldGVjdGVkPwpgYGB7cn0KcmFuZ2UobWV0YV9vbWljc19zZXAkcnQpCmBgYAoKIyMgTWFzcyB2cyBSVCBzY2F0dGVycGxvdApgYGB7cn0KIyBwbG90CihwbG90X216dnNydCA8LSBtZXRhX29taWNzX3NlcCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBydCwgeSA9IG16KSkgKwogIGdlb21fcG9pbnQoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiUmV0ZW50aW9uIHRpbWUsIG1pbiIsCiAgICAgICB5ID0gIm0veiIsCiAgICAgICB0aXRsZSA9ICJteiBhY3Jvc3MgUlQgZm9yIGFsbCBmZWF0dXJlcyIpKQpgYGAKCgojIyBIaXN0b2dyYW0gZm9yIG1hc3MgcmFuZ2UKYGBge3J9Cm1ldGFfb21pY3Nfc2VwICU+JQogIGdyb3VwX2J5KG16KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBteikpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDI1KSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiTW9ub2lzb3RvcGljIG1hc3MgKGFtdSkiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgZmVhdHVyZXMiLAogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZlYXR1cmVzIGJ5IG1hc3MiKQpgYGAKCiMjIEhpc3RvZ3JhbSBmb3IgUlQKCmBgYHtyfQptZXRhX29taWNzX3NlcCAlPiUKICBncm91cF9ieShteikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcnQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsgIyA2IHNlY29uZCBiaW5zCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiUmV0ZW50aW9uIHRpbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgZmVhdHVyZXMiLAogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZlYXR1cmVzIGJ5IHJldGVudGlvbiB0aW1lIikKYGBgCgojIE5BcyBhbmQgaW1wdXRpbmcKCiMjIE5BcwoKYGBge3J9CiMgc2FtcGxlcyBvbmx5IChubyBRQ3MpCm9taWNzZGF0YV9ub1FDIDwtIG9taWNzZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KC1jb250YWlucygicWMiKSkKCiNOQXMgaW4gc2FtcGxlcyBvbmx5PwpOQWJ5Um93X25vUUMgPC0gcm93U3Vtcyhpcy5uYShvbWljc2RhdGFfbm9RQ1ssLTFdKSkKCmhpc3QoTkFieVJvd19ub1FDLAogICAgIGJyZWFrcyA9IDcwLCAjIGJlY2F1c2UgdGhlcmUgYXJlIDcwIHNhbXBsZXMgCiAgICAgeGxhYiA9ICJOdW1iZXIgb2YgbWlzc2luZyB2YWx1ZXMiLAogICAgIHlsYWIgPSAiTnVtYmVyIG9mIG1ldGFib2xpdGVzIiwKICAgICBtYWluID0gIkhvdyBtYW55IG1pc3NpbmcgdmFsdWVzIGFyZSB0aGVyZT8iKQpgYGAKCkFyZSB0aGVyZSBhbnkgbWlzc2luZyB2YWx1ZXMgaW4gUUNzPyBUaGVyZSBzaG91bGRuJ3QgYmUgYWZ0ZXIgZGF0YSBwcmVwcm9jZXNzaW5nL2ZpbHRlcmluZwpgYGB7cn0Kb21pY3NkYXRhX1FDIDwtIG9taWNzZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHN0YXJ0c193aXRoKCJxYyIpKSAKCk5BYnlSb3dfUUMgPC0gY29sU3Vtcyhpcy5uYShvbWljc2RhdGFfUUMpKQojIGxldHMgY29uZmlybSB0aGF0IHRoZXJlIGFyZSBubyBtaXNzaW5nIHZhbHVlcyBmcm9tIG15IFFDcwpzdW0oTkFieVJvd19RQykgIyBubwpgYGAKCgpgYGB7cn0KIyBjYWxjdWxhdGUgaG93IG1hbnkgTkFzIHRoZXJlIGFyZSBwZXIgZmVhdHVyZSBpbiB3aG9sZSBkYXRhIHNldApjb250YWluc19OQXMgPC0gbWV0YV9vbWljcyAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgY291bnQoaXMubmEocGVha19oZWlnaHQpKSAlPiUKICBmaWx0ZXIoYGlzLm5hKHBlYWtfaGVpZ2h0KWAgPT0gVFJVRSkKa2FibGUoY29udGFpbnNfTkFzKQpgYGAKCgoKCiMjIFJlbW92ZSBOQXMKClRoZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXJlIG1pc3NpbmcgaW4gYSBtYWpvcml0eSBvZiBzdWJqZWN0cy4gSSdtIGdvaW5nIHRvIHJlbW92ZSB0aG9zZSBiZWNhdXNlIHRoZXkgbWF5IHNrZXcgdGhlIGRhdGEuIAoKYGBge3J9CiMgbnVtYmVyIG9mIGZlYXR1cmVzCm5yb3cob21pY3NkYXRhKQoKIyBSZW1vdmluZyBmZWF0dXJlcyBtaXNzaW5nIGZyb20gb3ZlciA5MCUgb2YgZGF0YQpvbWl0X2ZlYXR1cmVzIDwtIGNvbnRhaW5zX05BcyAlPiUKICBmaWx0ZXIobi83MCA+PSAwLjkwKQoKI3ByZXZpZXcKbnJvdyhvbWl0X2ZlYXR1cmVzKSAjIGZlYXR1cmVzIHRvIHJlbW92ZQoKIyBob3cgbWFueSBmZWF0dXJlcyBzaG91bGQgYmUgbGVmdD8KbnJvdyhvbWljc2RhdGEpIC0gbnJvdyhvbWl0X2ZlYXR1cmVzKQoKIyBub3cgcmVtb3ZlIHRoZXNlIGZlYXR1cmVzIGZyb20gdGhlIG9taWNzIGRhdGFzZXQKb21pY3NkYXRhIDwtIG9taWNzZGF0YSAlPiUKICBhbnRpX2pvaW4ob21pdF9mZWF0dXJlcywKICAgICAgICAgICAgYnkgPSAibXpfcnQiKQoKICMgY2hlY2sgbnVtYmVyIG9mIGZlYXR1cmVzIG5vdz8KbnJvdyhvbWljc2RhdGEpCmBgYAoKCgojIyBEYXRhIGltcHV0YXRpb24KYGBge3J9CiMgaW1wdXRlIGFueSBtaXNzaW5nIHZhbHVlcyBieSByZXBsYWNpbmcgdGhlbSB3aXRoIDEvMiBvZiB0aGUgbG93ZXN0IHBlYWsgaGVpZ2h0IHZhbHVlIG9mIGEgZmVhdHVyZSAoaS5lLiBpbiBhIHJvdykuCmltcHV0ZWRfb21pY3NkYXRhIDwtIG9taWNzZGF0YQoKaW1wdXRlZF9vbWljc2RhdGFbXSA8LSBsYXBwbHkoaW1wdXRlZF9vbWljc2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmEoeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oeCwgbmEucm0gPSBUUlVFKS8yLCB4KSkKCmRpbShpbXB1dGVkX29taWNzZGF0YSkKYGBgCgpBcmUgdGhlcmUgYW55IE5Bcz8KYGBge3J9CmltcHV0ZWRfb21pY3NkYXRhICU+JQogIGlzLm5hKCkgJT4lCiAgc3VtKCkKCiMgaW1wdXRhdGlvbnMgd29ya2VkCmBgYAoKIyBOZXcgdGlkeSBkZgpgYGB7cn0KIyBjcmVhdGUgbG9uZyBkZiBmb3IgaW1wdXRlZCBvbWljcyBkZgppbXB1dGVkX29taWNzZGF0YV90aWR5IDwtIGltcHV0ZWRfb21pY3NkYXRhICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gMzpuY29sKC4pLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJzYW1wbGUiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicGVha19oZWlnaHQiKSAlPiUKICBtdXRhdGUoc2FtcGxlMiA9IHNhbXBsZSkgJT4lCiAgIyBhZGQgYSBuZXcgY29sdW1uIHdpdGgganVzdCBzdWJqZWN0CiAgcmVuYW1lKCJzdWJqZWN0IiA9IHNhbXBsZTIpICU+JQogICMgcmVtb3ZlIHRoZSBzdWZmaXggZnJvbSBzdWJqZWN0IG5hbWVzCiAgbXV0YXRlX2F0KCJzdWJqZWN0Iiwgc3RyX3N1Yiwgc3RhcnQ9MiwgZW5kPTUpIAoKIyBjb21iaW5lIG1ldGEgYW5kIGltcHV0ZWQgb21pY3MgZGZzCmltcF9tZXRhX29taWNzIDwtIGZ1bGxfam9pbihpbXB1dGVkX29taWNzZGF0YV90aWR5LAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoInN1YmplY3QiID0gInN1YmplY3QiKSkKYGBgCgoKYGBge3J9CiMgc2VwYXJhdGUgbXogYW5kIHJ0CmltcF9tZXRhX29taWNzX3NlcCA8LSBpbXBfbWV0YV9vbWljcyAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibXoiLCAicnQiKSwKICAgICAgICAgICBzZXAgPSAiXyIpIAoKIyBjb252ZXJ0IGNvbHVtbnMgdG8gY29ycmVjdCB0eXBlCmltcF9tZXRhX29taWNzX3NlcCRteiA8LSBhcy5udW1lcmljKGltcF9tZXRhX29taWNzX3NlcCRteikKaW1wX21ldGFfb21pY3Nfc2VwJHJ0IDwtIGFzLm51bWVyaWMoaW1wX21ldGFfb21pY3Nfc2VwJHJ0KQoKYGBgCgoKIyBOb3RhbWUgZmVhdHVyZSByZWR1Y3Rpb24KdmlnbmV0dGUgZm9yIHJlZmVyZW5jZQpgYGB7cn0KI2Jyb3dzZVZpZ25ldHRlcygibm90YW1lIikKYGBgCgpMZXQncyBsb29rIGF0IHdoYXQgbWFzc2VzIGNvbWUgdXAgYXQgZWFjaCBSVCBhZ2FpbgoKYGBge3J9CiMgcnQgdnMgbXogcGxvdAppbXBfbWV0YV9vbWljc19zZXAgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcnQsIHkgPSBteikpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlJUIChtaW4pIiwKICAgICAgIHkgPSAibXoiKQpgYGAKVGhlcmUgYXJlIHNvbWUgcG9pbnRzIHRoYXQgYXJlIGF0IHRoZSBzYW1lIFJULCBtZWFuaW5nIHRoZXkgY291bGQgYmUgY29taW5nIGZyb20gdGhlIHNhbWUgY29tcG91bmQuIFdlJ2xsIHJ1biBub3RhbWUgY2x1c3RlcmluZyB0byBjb2xsYXBzZSBmZWF0dXJlcyBjb21pbmcgZnJvbSBvbmUgbWFzcyBpbnRvIG9uZSBmZWF0dXJlLgoKIyMgRGF0YSByZXN0cnVjdHVyaW5nIGZvciBub3RhbWUKYGBge3J9CiMgY3JlYXRlIGZlYXR1cmVzIGxpc3QgZnJvbSBpbXB1dGVkIGRhdGEgc2V0IHRvIG9ubHkgaW5jbHVkZSB1bmlxdWUgZmVhdHVyZSBJRCdzIChtel9ydCksIG16IGFuZCBSVApmZWF0dXJlcyA8LSBpbXBfbWV0YV9vbWljc19zZXAgJT4lCiAgY2JpbmQoaW1wX21ldGFfb21pY3MkbXpfcnQpICU+JQogIHJlbmFtZSgibXpfcnQiID0gImltcF9tZXRhX29taWNzJG16X3J0IikgJT4lCiAgZHBseXI6OnNlbGVjdChjKG16X3J0LCBteiwgcnQpKSAlPiUKICBkaXN0aW5jdCgpICMgcmVtb3ZlIHRoZSBkdXBsaWNhdGUgcm93cwoKIyBjcmVhdGUgYSBzZWNvbmQgZGF0YSBmcmFtZSB3aGljaCBpcyBqdXN0IGltcF9tZXRhX29taWNzIHJlc3RydWN0dXJlZCB0byBhbm90aGVyIHdpZGUgZm9ybWF0CmRhdGFfbm90YW1lIDwtIGRhdGEuZnJhbWUoaW1wdXRlZF9vbWljc2RhdGEgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KC1yb3dfaWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpKQoKZGF0YV9ub3RhbWUgPC0gZGF0YV9ub3RhbWUgJT4lCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oKSAlPiUgIyBjaGFuZ2Ugc2FtcGxlcyBmcm9tIHJvd25hbWVzIHRvIGl0cyBvd24gY29sdW1uCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXIgPSAxKSAjIGNoYW5nZSB0aGUgZmVhdHVyZSBJRHMgKG16X3J0KSBmcm9tIGZpcnN0IHJvdyBvYnMgaW50byBjb2x1bW4gbmFtZXMKYGBgCgoKQ2hlY2sgc3RydWN0dXJlcwpgYGB7cn0KIyBjaGVjayBpZiBteiBhbmQgcnQgYXJlIG51bWVyaWMKc3RyKGZlYXR1cmVzKQpgYGAKCmBgYHtyfQojIGNoZWNrIGlmIHJlc3VsdHMgYXJlIG51bWVyaWMKaGVhZChkYXRhX25vdGFtZSwgbiA9IDEpCgojIGNoYW5nZSB0byByZXN1bHRzIHRvIG51bWVyaWMKZGF0YV9ub3RhbWUgPC0gZGF0YV9ub3RhbWUgJT4lCiAgbXV0YXRlX2F0KC0xLCBhcy5udW1lcmljKQoKaGVhZChkYXRhX25vdGFtZSwgbiA9IDEpCmBgYAoKCiMjIEZpbmQgY29ubmVjdGlvbnMKYGBge3J9CmNvbm5lY3Rpb24gPC0gZmluZF9jb25uZWN0aW9ucyhkYXRhID0gZGF0YV9ub3RhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGZlYXR1cmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl90aHJlc2ggPSAwLjk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRfd2luZG93ID0gMS82MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfY29sID0gIm16X3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG16X2NvbCA9ICJteiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydF9jb2wgPSAicnQiKQoKaGVhZChjb25uZWN0aW9uKQpgYGAKCiMjIENsdXN0ZXJpbmcKYGBge3J9CmNsdXN0ZXJzIDwtIGZpbmRfY2x1c3RlcnMoY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uLCBkX3RocmVzaCA9IDAuOCkKYGBgCgpgYGB7cn0KIyBhc3NpZ24gYSBjbHVzdGVyIElEIHRvIGFsbCBmZWF0dXJlcy4gQ2x1c3RlcnMgYXJlIG5hbWVkIGFmdGVyIGZlYXR1cmUgd2l0aCBoaWdoZXN0IG1lZGlhbiBwZWFrIGhlaWdodApmZWF0dXJlc19jbHVzdGVyZWQgPC0gYXNzaWduX2NsdXN0ZXJfaWQoZGF0YV9ub3RhbWUsIGNsdXN0ZXJzLCBmZWF0dXJlcywgbmFtZV9jb2wgPSAibXpfcnQiKQoKIyBsZXRzIHNlZSBob3cgbWFueSBmZWF0dXJlcyBhcmUgcmVtb3ZlZCB3aGVuIHdlIG9ubHkga2VlcCBvbmUgZmVhdHVyZSBwZXIgY2x1c3RlcgpwdWxsZWQgPC0gcHVsbF9jbHVzdGVycyhkYXRhX25vdGFtZSwgZmVhdHVyZXNfY2x1c3RlcmVkLCBuYW1lX2NvbCA9ICJtel9ydCIpCmNsdXN0ZXJfZGF0YSA8LSBwdWxsZWQkY2RhdGEKY2x1c3Rlcl9mZWF0dXJlcyA8LSBwdWxsZWQkY2ZlYXR1cmVzCgojIGhvdyBtdWNoIGRpZCB3ZSB0cmltIG91ciBkYXRhIGRvd24gYnk/Cm5yb3cob21pY3NkYXRhKSAtIG5yb3coY2x1c3Rlcl9mZWF0dXJlcykKCmBgYAoKCmBgYHtyfQojIGV4cG9ydCBjbHVzdGVyZWQgZmVhdHVyZSBsaXN0CndyaXRlX2NzdihjbHVzdGVyX2ZlYXR1cmVzLAogICAgICAgICAgIk5vdGFtZS9ub3RhbWUtY2x1c3RlcmVkLWZlYXR1cmVzLmNzdiIpCgpgYGAKCgojIyBSZWR1Y2UgZGF0YXNldCBiYXNlZCBvbiBjbHVzdGVyaW5nCiAKYGBge3J9CiMgdHJhbnNwb3NlIHRoZSBmdWxsIGRhdGFzZXQgYmFjayB0byB3aWRlIHNvIHRoYXQgaXQgaXMgbW9yZSBzaW1pbGFyIHRvIHRoZSBub3RhbWUgZGF0YXNldAppbXBfbWV0YV9vbWljc193aWRlIDwtIGltcF9tZXRhX29taWNzICU+JQogIGRwbHlyOjpzZWxlY3QoLSJyb3dfaWQiKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbXpfcnQsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBwZWFrX2hlaWdodCkKCiMgbGlzdCBvZiByZWR1Y2VkIGZlYXR1cmVzCmNsdXN0ZXJuYW1lcyA8LSBjbHVzdGVyX2ZlYXR1cmVzJG16X3J0CgojIHNlbGVjdCBvbmx5IHRoZSBmZWF0dXJlcyBhcmUgaW4gdGhlIHJlZHVjZWQgbGlzdAppbXBfY2x1c3QgPC0gaW1wX21ldGFfb21pY3Nfd2lkZVssYyhuYW1lcyhpbXBfbWV0YV9vbWljc193aWRlKSAlaW4lIGNsdXN0ZXJuYW1lcyldCgojIGJpbmQgYmFjayBzYW1wbGUgbmFtZXMKaW1wX2NsdXN0IDwtIGNiaW5kKGltcF9tZXRhX29taWNzX3dpZGVbMV0sIGltcF9jbHVzdCkKCnRpYmJsZShpbXBfY2x1c3QpCgpgYGAKCgojIyBOZXcgbXogdnMgcnQgcGxvdAoKTGV0J3Mgc2VlIGhvdyBvdXIgY2x1c3RlcmVkIGRhdGEgbG9va3Mgbm93IGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbAoKYGBge3J9CiMgcGxvdCBuZXcgcnQgdnMgbXogc2NhdHRlcnBsb3QgcG9zdC1jbHVzdGVyaW5nCihwbG90X216dnNydF9wb3N0Y2x1c3RlciA8LSBjbHVzdGVyX2ZlYXR1cmVzICU+JQogIGdncGxvdChhZXMoeCA9IHJ0LAogICAgICAgICAgICAgeSA9IG16KSkgKwogIGdlb21fcG9pbnQoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiUmV0ZW50aW9uIHRpbWUsIG1pbiIsCiAgICAgICB5ID0gIm0veiwgbmV1dHJhbCIsCiAgICAgICB0aXRsZSA9ICJteiBhY3Jvc3MgUlQgZm9yIGFsbCBmZWF0dXJlcyBhZnRlciBjbHVzdGVyaW5nIikpCgoKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTAsIGZpZy5hc3A9MX0KIyBwbG90IGJvdGggc2NhdHRlcnBsb3RzIHRvIGNvbXBhcmUgd2l0aCBhbmQgd2l0aG91dCBub3RhbWUgY2x1c3RlcmluZwooc2NhdHRlcnBsb3RzIDwtIGdnYXJyYW5nZShwbG90X216dnNydCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfbXp2c3J0X3Bvc3RjbHVzdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIpKQpgYGAKCgojIFdyYW5nbGUgbmV3IGRhdGEKCmBgYHtyfQojIGFkZCBzdWJqZWN0IGNvbHVtbiBiYWNrIGZvciBhIHNlYW1sZXNzIGpvaW4gd2l0aCBtZXRhZGF0YQppbXBfY2x1c3Qkc3ViamVjdCA8LSBpbXBfbWV0YV9vbWljc193aWRlJHN1YmplY3QKCiMgYmluZCBiYWNrIG5ldyBjbHVzdGVyZWQgZGF0YSB3aXRoIG1ldGFkYXRhCmltcF9tZXRhYmluZF9jbHVzdCA8LSByaWdodF9qb2luKG1ldGFkYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wX2NsdXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJzdWJqZWN0IikKYGBgCgoKIyBWaXN1YWxpemUgdW50cmFuc2Zvcm1lZCBkYXRhCgojIyBNb3JlIHdyYW5nbGluZwpgYGB7cn0KIyBtZXRhIGRhdGEgY29sdW1ucyAKc3RyX21ldGEgPC0gY29sbmFtZXMoaW1wX21ldGFiaW5kX2NsdXN0Wyw0OjEzXSkKCiMgY2hhbmdlIG1ldGEgZGF0YSBjb2x1bW5zIHRvIGNoYXJhY3RlciBzbyB0aGF0IEkgY2FuIGNoYW5nZSBOQXMgZnJvbSBRQ3MgdG8gIlFDIgppbXBfbWV0YWJpbmRfY2x1c3QgPC0gaW1wX21ldGFiaW5kX2NsdXN0ICU+JQogIG11dGF0ZV9hdChzdHJfbWV0YSwgYXMuY2hhcmFjdGVyKSAKCiMgcmVwbGFjZSBOQXMgaW4gbWV0YWRhdGEgY29sdW1ucyBmb3IgUUNzCmltcF9tZXRhYmluZF9jbHVzdFtpcy5uYShpbXBfbWV0YWJpbmRfY2x1c3QpXSA8LSAiUUMiCgojIGxvbmcgZGYKaW1wX21ldGFiaW5kX2NsdXN0X3RpZHkgPC0gaW1wX21ldGFiaW5kX2NsdXN0ICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gMTU6bmNvbCguKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAibXpfcnQiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVsX2FidW5kIikKCiMgc3RydWN0dXJlIGNoZWNrCmhlYWQoaW1wX21ldGFiaW5kX2NsdXN0X3RpZHkpCmBgYAoKCiMjIEJveHBsb3QKYGBge3J9CmltcF9tZXRhYmluZF9jbHVzdF90aWR5ICU+JQogIGdncGxvdChhZXMoeCA9IHN1YmplY3QsIHkgPSByZWxfYWJ1bmQsIGNvbG9yID0gdHJlYXRtZW50KSkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuNikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJvcmFuZ2UiLCAibGlnaHRncmVlbiIsICJncmF5IiwgInRvbWF0bzEiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKICBsYWJzKHRpdGxlID0gIkxDLU1TICgrKSBGZWF0dXJlIEFidW5kYW5jZXMgYnkgU2FtcGxlIiwKICAgICAgIHN1YnRpdGxlID0gIlVuc2NhbGVkIGRhdGEiLAogICAgICAgeSA9ICJSZWxhdGl2ZSBhYnVuZGFuY2UiKQpgYGAKCldpbGwgbmVlZCB0byBsb2cgdHJhbnNmb3JtIGluIG9yZGVyIHRvIG5vcm1hbGl6ZSBhbmQgYWN0dWFsbHkgc2VlIHRoZSBkYXRhCgojIExvZzIgdHJhbnNmb3JtCmBgYHtyfQppbXBfbWV0YWJpbmRfY2x1c3RfdGlkeV9sb2cyIDwtIGltcF9tZXRhYmluZF9jbHVzdF90aWR5ICU+JQogIG11dGF0ZShyZWxfYWJ1bmRfbG9nMiA9IGxvZzIocmVsX2FidW5kKSkKYGBgCgojIyBCb3hwbG90CmBgYHtyLCBmaWcud2lkdGg9MTB9CihicF9kYXRhX3F1YWxpdHkgPC0gaW1wX21ldGFiaW5kX2NsdXN0X3RpZHlfbG9nMiAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzYW1wbGUsIHkgPSByZWxfYWJ1bmRfbG9nMiwgY29sb3IgPSB0cmVhdG1lbnQpKSArCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIm9yYW5nZSIsICJsaWdodGdyZWVuIiwgImdyYXkiLCAidG9tYXRvMSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogIGxhYnModGl0bGUgPSAiTEMtTVMgKCspIEZlYXR1cmUgQWJ1bmRhbmNlcyBieSBTYW1wbGUiLAogICAgICAgc3VidGl0bGUgPSAiTG9nMiB0cmFuc2Zvcm1lZCBkYXRhIiwKICAgICAgIHkgPSAiUmVsYXRpdmUgYWJ1bmRhbmNlIikpCmBgYAoKCgojIE5vdGFtZSBkcmlmdCBjb3JyZWN0aW9uCgojIyBEYXRhIHdyYW5nbGluZwoKIyMjIEZlYXR1cmUgYWJ1bmQgZGYgCgpgYGB7cn0KIyBmaWx0ZXJlZCBhbmQgaW1wdXRlZCBkYXRhIGFmdGVyIG5vdGFtZSBjbHVzdGVyaW5nLCB0cmFuc3Bvc2VkCmZlYXR1cmVzX2ZvclFDY29yciA8LSBpbXBfY2x1c3QgJT4lCiAgZHBseXI6OnNlbGVjdCghc3ViamVjdCkgJT4lCiAgdCgpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICByb3dfdG9fbmFtZXMocm93X251bWJlciA9ICJmaW5kX2hlYWRlciIpCgojIGxvZzIgdHJhbnNmb3JtCmxvZzJfZmVhdHVyZXNfZm9yUUNjb3JyIDwtIGZlYXR1cmVzX2ZvclFDY29yciAlPiUKICBtdXRhdGVfYWxsKGFzLm51bWVyaWMpICU+JQogIGxvZzIoKQoKIyB3cml0ZSBjc3YgdG8gbWFudWFsbHkgZWRpdAp3cml0ZS5jc3YobG9nMl9mZWF0dXJlc19mb3JRQ2NvcnIsCiAgICAgICAgICAiTm90YW1lL2ZlYXVyZXNfZnJvbVJfZm9yRENfMS5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzID0gVFJVRSkKYGBgCgpJbXBvcnQgY29ycmVjdGVkIGRmIChlZGl0ZWQgc28gdGhhdCAibXpfcnQiIGNvdWxkIGJlIHRoZSByb3cgbmFtZSBmb3Igcm93IDEpCmBgYHtyfQoKbG9nMl9mZWF0dXJlc19mb3JRQ2NvcnJfbmV3IDwtIHJlYWQuY3N2KCJOb3RhbWUvZmVhdXJlc19mb3JSX2ZvckRDX2VkaXRlZG16cnRfMi5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IDEpCgoKbG9nMl9mZWF0dXJlc19mb3JRQ2NvcnJfbmV3IDwtIGxvZzJfZmVhdHVyZXNfZm9yUUNjb3JyX25ldyAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIm16X3J0IikgJT4lCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXIgPSAxKSAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibXoiLCAicnQiKSwKICAgICAgICAgICBzZXAgPSAiXyIpCgp3cml0ZS5jc3YobG9nMl9mZWF0dXJlc19mb3JRQ2NvcnJfbmV3LAogICAgICAgICAgIk5vdGFtZS9mZWF0dXJlc19mcm9tUl9mb3JEQ18zLmNzdiIsCiAgICAgICAgICByb3cubmFtZXMgPSBUUlVFKQoKYGBgCgoKCiMjIyBQaGVubyBkZgoKYGBge3J9CiMgc2VwYXJhdGUgc2FtcGxlSUQgYW5kIGluamVjdGlvbiBvcmRlcgpwaGVub19kYXRhIDwtIGltcF9jbHVzdFsxXSAlPiUKICBzZXBhcmF0ZShjb2wgPSBzYW1wbGUsCiAgICAgICAgICAgaW50byA9IGMoInNhbXBsZSIsICJpbmplY3Rpb25fb3JkZXIiKSwKICAgICAgICAgICAjIGxhc3QgdW5kZXJzY29yZQogICAgICAgICAgIHNlcCA9ICJfKD8hLipfKSIpCgoKCiMgbWFrZSBpbmogb3JkZXIgY29sdW1uIG51bWVyaWMKcGhlbm9fZGF0YSA8LSBwaGVub19kYXRhICU+JQogIG11dGF0ZV9hdCgiaW5qZWN0aW9uX29yZGVyIiwgYXMubnVtZXJpYykKCnRfcGhlbm9fZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHQocGhlbm9fZGF0YSkpCgp3cml0ZS5jc3YodF9waGVub19kYXRhLAogICAgICAgICAgIk5vdGFtZS9waGVub19kZi5jc3YiLAogICAgICAgICAgcm93Lm5hbWVzID0gVFJVRSkKYGBgCgpDb21iaW5lIHBoZW5vIGFuZCBmZWF0dXJlIGRmcyBtYW51YWxseSBpbiBleGNlbCB0byBjcmVhdGUgbWV0YWJvc2V0IGRmLgoKIyMgSW1wb3J0IE1ldGFib3NldAoKYGBge3J9CgojbWFrZSBzdXJlIHdoZW4gY29udmVydGluZyBjc3YgdG8geGxzeCB0aGF0IHlvdSBzYXZlIGFzIGEgbmV3IGZpbGUsIGRvbid0IGp1c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBmaWxlCm1ldGFib3NldCA8LSByZWFkX2Zyb21fZXhjZWwoIk5vdGFtZS9tZXRhYm9zZXQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfYnkgPSBjKCJjb2x1bW4iLCAiSW9uIG1vZGUiKSkKCmBgYAoKCmBgYHtyfQojY29uc3RydWN0IE1ldGFib3NldAptb2RlcyA8LSBjb25zdHJ1Y3RfbWV0YWJvc2V0cyhleHBycyA9IG1ldGFib3NldCRleHBycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhlbm9fZGF0YSA9IG1ldGFib3NldCRwaGVub19kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2RhdGEgPSBtZXRhYm9zZXQkZmVhdHVyZV9kYXRhLCBncm91cF9jb2wgPSAiQ2xhc3MiKQoKI2V4dHJhY3QgZWFjaCBtb2RlIGludG8gYSBzaW5nbGUgb2JqZWN0Cm1vZGUgPC0gbW9kZXMkQzE4X25lZwpgYGAKCgojIyBCb3hwbG90cyBiZWZvcmUgY29ycmVjdGlvbgoKYGBge3IsIGZpZy53aWR0aD0xMH0KIyBvcmRlcmVkIGJ5IGluamVjdGlvbgoocXVhbGl0eUJQc19iNGNvcnJlY3Rpb24gPC0gcGxvdF9zYW1wbGVfYm94cGxvdHMobW9kZSwgb3JkZXJfYnkgPSBjKCJDbGFzcyIsICJJbmplY3Rpb25fb3JkZXIiKSwgdGl0bGUgPSAiVW5jb3JyZWN0ZWQgZmVhdHVyZSBhYnVuZGFuY2UiKSkKCiNvcmRlcmVkIGJ5IGNsYXNzCnBsb3Rfc2FtcGxlX2JveHBsb3RzKG1vZGUsIG9yZGVyX2J5ID0gIkluamVjdGlvbl9vcmRlciIsIHRpdGxlID0gIlVuY29ycmVjdGVkIGZlYXR1cmUgYWJ1bmRhbmNlIikKYGBgCgoKIyMgQm94cGxvdHMgYWZ0ZXIgUUMgZHJpZnQgY29ycmVjdGlvbgoKZHJpZnQgY29ycmVjdGlvbiB0YWtlcyB1cCB0byAyIG1pbnV0ZXMKYGBge3J9Cm1vZGUgPC0gZmxhZ19kZXRlY3Rpb24obW9kZSwgcWNfbGltaXQgPSAwLjc1LCBncm91cF9saW1pdCA9IDAuOCkKCgpjb3JyZWN0ZWQgPC0gY29ycmVjdF9kcmlmdChtb2RlLCBsb2dfdHJhbnNmb3JtID0gRkFMU0UpCmBgYAoKCiMjIyBEaWQgZHJpZnQgY29ycmVjdGlvbiB3b3JrPwoKIG91dHB1dCBpcyBwZXJjZW50IG9mIHRoZSBmZWF0dXJlcyB0aGF0IHdlcmUgZHJpZnQgY29ycmVjdGVkLiBUaGUgcmVtYWluaW5nICJsb3ctcXVhbGl0eSIgcGVyY2VudCByZXByZXNlbnRzIGZlYXR1cmVzIGZvciB3aGljaCB0aGUgREMgZGlkICpub3QqIGltcHJvdmUgdGhlIFJTRCBhbmQgRC1yYXRpbyBvZiB0aGUgb3JpZ2luYWwgZGF0YS4KCmBgYHtyfQppbnNwZWN0ZWQgPC0gaW5zcGVjdF9kYyhvcmlnID0gbW9kZSwgZGMgPSBjb3JyZWN0ZWQsIGNoZWNrX3F1YWxpdHkgPSBUUlVFKQpgYGAKCiMjIyBCb3hwbG90cywgY29ycmVjdGVkCmBgYHtyLCBmaWcud2lkdGg9MTB9CgoocXVhbGl0eUJQU19kcmlmdGNvcnJlY3Rpb24gPC0gcGxvdF9zYW1wbGVfYm94cGxvdHMoY29ycmVjdGVkLCBvcmRlcl9ieSA9IGMoIkNsYXNzIiwgIkluamVjdGlvbl9vcmRlciIpLCB0aXRsZSA9ICJDb3JyZWN0ZWQgZmVhdHVyZSBhYnVuZGFuY2UiKSkKCnBsb3Rfc2FtcGxlX2JveHBsb3RzKGNvcnJlY3RlZCwgb3JkZXJfYnkgPSAiSW5qZWN0aW9uX29yZGVyIiwgdGl0bGUgPSAiQ29ycmVjdGVkIGZlYXR1cmUgYWJ1bmRhbmNlIikKYGBgCgoKIyMgQ29tcGFyZSBxdWFsaXR5IEJQcwpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CihxdWFsaXR5QlBzX2NvbXBhcmVkIDwtIGdnYXJyYW5nZShxdWFsaXR5QlBzX2I0Y29ycmVjdGlvbiwgcXVhbGl0eUJQU19kcmlmdGNvcnJlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIG5yb3cgPSAyKSkKCgpgYGAKCgojIyBFeHBvcnQgbmV3IE1ldGFib3NldCB0byBFeGNlbCBzcHJlYWRzaGVldApgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX3RvX2V4Y2VsKGNvcnJlY3RlZCwgIk5vdGFtZS9tZXRhYm9zZXRfY29ycmVjdGVkLnhsc3giKQpgYGAKCk1hbnVhbGx5IGVkaXQgdGhlIGRmIHNvIGl0IG9ubHkgaGFzIG1hc3MsIHJ0LCBhbmQgc2FtcGxlIGNvbHVtbnMKCiMjIEltcG9ydCBlZGl0ZWQgTWV0YWJvc2V0CgpgYGB7cn0KbWV0YWJkYXRhX2NvcnJlY3RlZCA8LSByZWFkLmNzdihmaWxlID0gIk5vdGFtZS9tZXRhYm9zZXRfY29ycmVjdGVkX2VkaXRlZGZvclIuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjay5uYW1lcyA9IEZBTFNFKQpgYGAKCiMjIFdyYW5nbGUgbmV3IG1ldGFiIGRhdGEKCiMjIyBDb21iaW5lIG16ICYgcnQgYmFjayB0b2dldGhlcgoKYGBge3J9Cm1ldGFiZGF0YV9jb3JyZWN0ZWRfTVpfUlQgPC0gbWV0YWJkYXRhX2NvcnJlY3RlZCAlPiUKICBtdXRhdGUobWFzcyA9IHJvdW5kKG1ldGFiZGF0YV9jb3JyZWN0ZWQkbWFzcywgZGlnaXRzID0gNCksICMgRGVjcmVhc2UgbnVtYmVyIG9mIGRlY2ltYWxzIGZvciBtL3ogJiBydAogICAgICAgICBydCA9IHJvdW5kKG1ldGFiZGF0YV9jb3JyZWN0ZWQkcnQsIGRpZ2l0cyA9IDMpLAogICAgICAgICAuYmVmb3JlPTEsCiAgICAgICAgIC5rZWVwPSJ1bnVzZWQiKSAlPiUKICB1bml0ZShtel9ydCwgYyhtYXNzLCBydCksIHJlbW92ZT1UUlVFKSAjIENvbWJpbmUgbS96ICYgcnQgd2l0aCBfIGluIGJldHdlZW4KCmBgYAoKIyMjIFRyYW5zcG9zZSBuZXcgZGYKCmBgYHtyfQptZXRhYmRhdGFfY29ycmVjdGVkX3QgPC0gYXMuZGF0YS5mcmFtZSh0KG1ldGFiZGF0YV9jb3JyZWN0ZWRfTVpfUlQpKSAlPiUKICByb3dfdG9fbmFtZXMocm93X251bWJlciA9ICJmaW5kX2hlYWRlciIpICU+JSAjIG1ha2UgTVpfUlQgY29sdW1uIG5hbWVzCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzYW1wbGUiKSAjIGNoYW5nZSByb3duYW1lcyB0byBjb2x1bW4gMQogIApgYGAKCiMjIyBCaW5kIG5ldyBkYXRhIHdpdGggbWV0YWRhdGEKCkkgd2FudCB0aGUgbmV3ICJtZXRhYmRhdGFfY29ycmVjdGVkX3QiIGRmIHRvIGxvb2sganVzdCBsaWtlICJpbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiIgZGYKCmBgYHtyfQojIGdvIGJhY2sgdG8gd2lkZSBkYXRhCmltcF9tZXRhYmluZF9jbHVzdF9sb2cyIDwtIGltcF9tZXRhYmluZF9jbHVzdF90aWR5X2xvZzIgJT4lCiAgZHBseXI6OnNlbGVjdCghcmVsX2FidW5kKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbXpfcnQsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSByZWxfYWJ1bmRfbG9nMikKYGBgCgoKYGBge3J9CgojIGJpbmQgbWV0YWRhdGEgY29sdW1ucyB0byB0aGUgbmV3IGRyaWZ0IGNvcnJlY3RlZCBkZgpEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiA8LSBmdWxsX2pvaW4oaW1wX21ldGFiaW5kX2NsdXN0X2xvZzJbLGMoMToxNCldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFiZGF0YV9jb3JyZWN0ZWRfdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJzYW1wbGUiKQoKIyBmaXggUUMgc3ViamVjdCBuYW1lcwpEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiRzdWJqZWN0IDwtIHN0cl9yZXBsYWNlX2FsbChEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiRzdWJqZWN0LCAiYyIsICJxYyIpCgpEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiA8LSBEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiAlPiUKICBtdXRhdGVfYXQoInN1YmplY3QiLCBzdHJfc3ViLCBzdGFydD0xLCBlbmQ9NCkKCgojIG1ha2UgZmVhdHVyZSBhYnVuZGFuY2VzIG51bWVyaWMKRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzIgPC0gRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzIgJT4lCiAgbXV0YXRlX2F0KDE1Om5jb2woLiksIGFzLm51bWVyaWMpCiAgCmBgYAoKCiMgUENBcwoKIyMgV2l0aCBRQ1MKCiMjIyBXcmFuZ2xlCgoKYGBge3J9CgpQQ0EuRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzIgPC0gUENBKERDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyLCAgIyB3aWRlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaS5zdXAgPSAxOjE0LCAjIHJlbW92ZSBxdWFsaXRhdGl2ZSB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaCA9IEZBTFNFLCAjIGRvbid0IGdyYXBoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUudW5pdCA9IEZBTFNFKSAjIGRvbid0IHNjYWxlLCBhbHJlYWR5IHRyYW5zZm9ybWVkIGRhdGEKCiMgUENBIHN1bW1hcnkKa2FibGUoc3VtbWFyeShQQ0EuRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzIpKQpgYGAKCmBgYHtyfQojIHB1bGwgUEMgY29vcmRpbmF0ZXMgaW50byBkZgpQQ19jb29yZF9RQ19sb2cyIDwtIGFzLmRhdGEuZnJhbWUoUENBLkRDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyJGluZCRjb29yZCkKCiMgYmluZCBiYWNrIG1ldGFkYXRhIGZyb20gY29scyAxLTE0ClBDX2Nvb3JkX1FDX2xvZzIgPC0gYmluZF9jb2xzKERDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyWywxOjE0XSwgUENfY29vcmRfUUNfbG9nMikKCiMgZ3JhYiBzb21lIHZhcmlhbmNlIGV4cGxhaW5lZAppbXBvcnRhbmNlX1FDIDwtIFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiRlaWcKCiMgc2V0IHZhcmlhbmNlIGV4cGxhaW5lZCB3aXRoIFBDMSwgcm91bmQgdG8gMiBkaWdpdHMKUEMxX3dpdGhRQyA8LSByb3VuZChpbXBvcnRhbmNlX1FDWzEsMl0sIDIpCgojIHNldCB2YXJpYW5jZSBleHBsYWluZWQgd2l0aCBQQzIsIHJvdW5kIHRvIDIgZGlnaXRzClBDMl93aXRoUUMgPC0gcm91bmQoaW1wb3J0YW5jZV9RQ1syLDJdLCAyKQpgYGAKCiMjIyBQbG90cwpVc2luZyBGYWN0b0V4dHJhIHBhY2thZ2UKYGBge3J9CiMgc2NyZWUgcGxvdApmdml6X2VpZyhQQ0EuRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzIpCgojIGdldCBlaWdlbnZhbHVlcwprYWJsZShnZXRfZWlnKFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMikpCmBgYAoKYGBge3J9CiMgc2NvcmVzIHBsb3QKZnZpel9wY2FfaW5kKFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMikKYGBgCgoKIyMjIE1hbnVhbCBzY29yZXMgcGxvdAoKYGBge3J9CiMgbWFudWFsIHNjb3JlcyBwbG90CihQQ0Ffd2l0aFFDcyA8LSBQQ19jb29yZF9RQ19sb2cyICU+JQogIGdncGxvdChhZXMoeCA9IERpbS4xLCB5ID0gRGltLjIsCiAgICAgICAgICAgICBmaWxsID0gZmFjdG9yKHRyZWF0bWVudCwgbGV2ZWxzID0gYygiY29udHJvbCIsICJiZXRhIiwgInJlZCIsICJRQyIpKSwKICAgICAgICAgICAgIHRleHQgPSBzYW1wbGUpKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBhbHBoYSA9IDAuOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0Z3JlZW4iLCAib3JhbmdlIiwgInRvbWF0byIsICJsaWdodGdyYXkiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAiYmxhY2siKSArICAKICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZpeGVkKFBDMl93aXRoUUMvUEMxX3dpdGhRQykgKwogIGxhYnMoeCA9IGdsdWU6OmdsdWUoIlBDMToge1BDMV93aXRoUUN9JSIpLAogICAgICAgeSA9IGdsdWU6OmdsdWUoIlBDMjoge1BDMl93aXRoUUN9JSIpLAogICAgICAgZmlsbCA9ICJHcm91cCIsCiAgICAgICB0aXRsZSA9ICJQcmluY2lwYWwgQ29tcG9uZW50cyBBbmFseXNpcyBTY29yZXMgUGxvdCIsCiAgICAgICBzdWJ0aXRsZSA9ICJMb2cyIHRyYW5zZm9ybWVkIGRhdGEiKSkKCmdncGxvdGx5KFBDQV93aXRoUUNzLCB0b29sdGlwID0gInRleHQiKQpgYGAKCiMjIFdpdGhvdXQgUUNzCgojIyMgV3JhbmdsZSAKCmBgYHtyfQpEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMl9ub1FDcyA8LSBEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMiAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICE9ICJRQyIpCgpQQ0EuRENfaW1wX21ldGFiaW5kX2NsdXN0X2xvZzJfbm9RQ3MgPC0gUENBKERDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyX25vUUNzLCAjIHdpZGUgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGkuc3VwPTE6MTQsICMgcmVtb3ZlIHF1YWxpdGF0aXZlIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGg9RkFMU0UsICMgZG9uJ3QgZ3JhcGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLnVuaXQ9RkFMU0UpICMgZG9uJ3Qgc2NhbGUsIHdlIGFscmVhZHkgZGlkIHRoaXMKCiMgbG9vayBhdCBzdW1tYXJ5CmthYmxlKHN1bW1hcnkoUENBLkRDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyX25vUUNzKSkKYGBgCgpgYGB7cn0KIyBwdWxsIFBDIGNvb3JkaW5hdGVzIGludG8gZGYKUENfY29vcmRfbm9RQ3NfbG9nMiA8LSBhcy5kYXRhLmZyYW1lKFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMl9ub1FDcyRpbmQkY29vcmQpCgojIGJpbmQgYmFjayBtZXRhZGF0YSBmcm9tIGNvbHMgMS0xNApQQ19jb29yZF9ub1FDc19sb2cyIDwtIGJpbmRfY29scyhEQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMl9ub1FDc1ssMToxNF0sIFBDX2Nvb3JkX25vUUNzX2xvZzIpCgojIGdyYWIgc29tZSB2YXJpYW5jZSBleHBsYWluZWQKaW1wb3J0YW5jZV9ub1FDIDwtIFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMl9ub1FDcyRlaWcKCiMgc2V0IHZhcmlhbmNlIGV4cGxhaW5lZCB3aXRoIFBDMSwgcm91bmQgdG8gMiBkaWdpdHMKUEMxX25vUUMgPC0gcm91bmQoaW1wb3J0YW5jZV9ub1FDWzEsMl0sIDIpCgojIHNldCB2YXJpYW5jZSBleHBsYWluZWQgd2l0aCBQQzIsIHJvdW5kIHRvIDIgZGlnaXRzClBDMl9ub1FDIDwtIHJvdW5kKGltcG9ydGFuY2Vfbm9RQ1syLDJdLCAyKQpgYGAKCiMjIyBQbG90cwpVc2luZyBGYWN0b0V4dHJhCgpgYGB7cn0KIyBzY3JlZSBwbG90CmZ2aXpfZWlnKFBDQS5EQ19pbXBfbWV0YWJpbmRfY2x1c3RfbG9nMl9ub1FDcykKYGBgCgpgYGB7cn0KIyBzY29yZXMgcGxvdApmdml6X3BjYV9pbmQoUENBLkRDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyX25vUUNzKQpgYGAKCgojIyMgTWFudWFsIHNjb3JlcyBwbG90CgpgYGB7cn0KIyB3cmFuZ2xpbmcgZGF0YSBwcmlvciB0byBwbG90IGZvciBlYXNlClBDX2Nvb3JkX25vUUNzX2xvZzIgPC0gUENfY29vcmRfbm9RQ3NfbG9nMiAlPiUKICBtdXRhdGUoc2FtcGxlMiA9IHNhbXBsZSkgJT4lCiAgbXV0YXRlX2F0KCJzYW1wbGUyIiwgc3RyX3N1Yiwgc3RhcnQ9NywgZW5kPTgpICU+JQogIG11dGF0ZShwZXJpb2QgPSBzYW1wbGUyKSAlPiUKICB1bml0ZSh0cmVhdG1lbnRfcGVyaW9kLCAidHJlYXRtZW50IiwgInBlcmlvZCIsIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogIGRwbHlyOjpzZWxlY3QoIXNhbXBsZTIpICU+JQogIG11dGF0ZV9hdCgicGVyaW9kIiwgYXMuZmFjdG9yKSAlPiUKICAjIHJlbGV2ZWwgZmFjdG9ycwogIG11dGF0ZSh0cmVhdG1lbnRfcGVyaW9kID0gZmN0X3JlbGV2ZWwodHJlYXRtZW50X3BlcmlvZCwgYygiY29udHJvbF9iMSIsICJjb250cm9sX2IzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZXRhX2IxIiwgImJldGFfYjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkX2IxIiwgInJlZF9iMyIpKSwKICAgICAgICAgdHJlYXRtZW50ID0gZmN0X3JlbGV2ZWwodHJlYXRtZW50LCBjKCJjb250cm9sIiwgImJldGEiLCAicmVkIikpKQpgYGAKCmBgYHtyfQooUENBX3dpdGhvdXRRQ3MgPC0gUENfY29vcmRfbm9RQ3NfbG9nMiAlPiUKICAgZ2dwbG90KGFlcyh4ID0gRGltLjEsIHkgPSBEaW0uMiwKICAgICAgICAgICAgIGZpbGwgPSB0cmVhdG1lbnRfcGVyaW9kLAogICAgICAgICAgICAgdGV4dCA9IHNhbXBsZSkpICsKICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBhbHBoYSA9IDAuOCkgKwogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjUpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGE9MC41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya3NlYWdyZWVuMiIsICJkYXJrZ3JlZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YW4zIiwgIm9yYW5nZXJlZDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdmVuZGVyYmx1c2gzIiwgImRhcmtyZWQiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAiYmxhY2siKSArICAKICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZpeGVkKFBDMl9ub1FDL1BDMV9ub1FDKSArCiAgbGFicyh4ID0gZ2x1ZTo6Z2x1ZSgiUEMxOiB7UEMxX25vUUN9JSIpLAogICAgICAgeSA9IGdsdWU6OmdsdWUoIlBDMjoge1BDMl9ub1FDfSUiKSwKICAgICAgIGZpbGwgPSAiR3JvdXAiLAogICAgICAgdGl0bGUgPSAiUHJpbmNpcGFsIENvbXBvbmVudHMgQW5hbHlzaXMgU2NvcmVzIFBsb3QiLAogICAgICAgc3VidGl0bGUgPSAiTG9nMiB0cmFuc2Zvcm1lZCBkYXRhLCBObyBRQ3MiKSkKZ2dwbG90bHkoUENBX3dpdGhvdXRRQ3MsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKCiMjIyBGYWNldGVkIGJ5IHBlcmlvZAoKCmBgYHtyfQooUENBX2ZhY2V0ZWRfbm9RQ3MgPC0gUENfY29vcmRfbm9RQ3NfbG9nMiAlPiUKICAgZ2dwbG90KGFlcyh4ID0gRGltLjEsIHkgPSBEaW0uMiwKICAgICAgICAgICAgIGZpbGwgPSB0cmVhdG1lbnRfcGVyaW9kLAogICAgICAgICAgICAgdGV4dCA9IHNhbXBsZSkpICsKICAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLCBhbHBoYSA9IDAuOCkgKwogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjUpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGE9MC41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya3NlYWdyZWVuMiIsICJkYXJrZ3JlZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YW4zIiwgIm9yYW5nZXJlZDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdmVuZGVyYmx1c2gzIiwgImRhcmtyZWQiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSAiYmxhY2siKSArICAKICB0aGVtZV9idygpICsKICBjb29yZF9maXhlZChQQzJfbm9RQy9QQzFfbm9RQykgKwogIGxhYnMoeCA9IGdsdWU6OmdsdWUoIlBDMToge1BDMV9ub1FDfSUiKSwKICAgICAgIHkgPSBnbHVlOjpnbHVlKCJQQzI6IHtQQzJfbm9RQ30lIiksCiAgICAgICBmaWxsID0gInRyZWF0bWVudF9wZXJpb2QiLAogICAgICAgdGl0bGUgPSAiUHJpbmNpcGFsIENvbXBvbmVudHMgQW5hbHlzaXMgU2NvcmVzIFBsb3QiLAogICAgICAgc3VidGl0bGUgPSAiTG9nMiB0cmFuc2Zvcm1lZCBkYXRhLCBObyBRQ3MiKSArCiAgZmFjZXRfd3JhcCggfiBwZXJpb2QpICsKICAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ3aGl0ZSIpKSkKCmdncGxvdGx5KFBDQV9mYWNldGVkX25vUUNzLCB0b29sdGlwID0gInRleHQiKQpgYGAKCmBgYHtyfQpQQ19jb29yZF9ub1FDc19sb2cyICU+JQogICBnZ3Bsb3QoYWVzKHggPSBEaW0uMSwgeSA9IERpbS4yLAogICAgICAgICAgICAgZmlsbCA9IHNleCwKICAgICAgICAgICAgIHRleHQgPSBzYW1wbGUpKSArCiAgIGdlb21fcG9pbnQoc2hhcGUgPSAyMSwgYWxwaGEgPSAwLjgpICsKICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGE9MC41KSArCiAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhPTAuNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInB1cnBsZSIsICJibHVlIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gImJsYWNrIikgKyAgCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZml4ZWQoUEMyX25vUUMvUEMxX25vUUMpICsKICBsYWJzKHggPSBnbHVlOjpnbHVlKCJQQzE6IHtQQzFfbm9RQ30lIiksCiAgICAgICB5ID0gZ2x1ZTo6Z2x1ZSgiUEMyOiB7UEMyX25vUUN9JSIpLAogICAgICAgZmlsbCA9ICJzZXgiLAogICAgICAgdGl0bGUgPSAiUHJpbmNpcGFsIENvbXBvbmVudHMgQW5hbHlzaXMgU2NvcmVzIFBsb3QiLAogICAgICAgc3VidGl0bGUgPSAiTG9nMiB0cmFuc2Zvcm1lZCBkYXRhLCBObyBRQ3MiKSArCiAgZmFjZXRfd3JhcCggfiBwZXJpb2QpICsKICAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ3aGl0ZSIpKQpgYGAKCiMjIyBGYWNldGVkIGJ5IHRydAoKYGBge3IsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTh9CnRydF9sYWJlbHMgPC0gYygiY29udHJvbCIgPSAiQ29udHJvbCIsCiAgICAgICAgICAgICAgICAiYmV0YSIgPSAiSGlnaCBcVTAzYjItQ2Fyb3RlbmUiLCAKICAgICAgICAgICAgICAgICJyZWQiID0gIkhpZ2ggTHljb3BlbmUiKQoKKFBDQV9mYWNldGVkX25vUUNzMiA8LSBQQ19jb29yZF9ub1FDc19sb2cyICU+JQogICBnZ3Bsb3QoYWVzKHggPSBEaW0uMSwgeSA9IERpbS4yLAogICAgICAgICAgICAgZmlsbCA9IHRyZWF0bWVudF9wZXJpb2QsCiAgICAgICAgICAgICB0ZXh0ID0gc2FtcGxlKSkgKwogICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGFscGhhID0gMC44KSArCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhPTAuNSkgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrc2VhZ3JlZW4yIiwgImRhcmtncmVlbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhbiIsICJvcmFuZ2VyZWQyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXZlbmRlcmJsdXNoMyIsICJkYXJrcmVkIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicHJlIGNvbnRyb2wiLCAicG9zdCBjb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmUgaGlnaCBcVTAzYjItY2Fyb3RlbmUiLCAicG9zdCBoaWdoIFxVMDNiMi1jYXJvdGVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlIGhpZ2ggbHljb3BlbmUiLCAicG9zdCBoaWdoIGx5Y29wZW5lIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gImJsYWNrIikgKyAgCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZml4ZWQoUEMyX25vUUMvUEMxX25vUUMpICsKICBsYWJzKHggPSBnbHVlOjpnbHVlKCJQQzE6IHtQQzFfbm9RQ30lIiksCiAgICAgICB5ID0gZ2x1ZTo6Z2x1ZSgiUEMyOiB7UEMyX25vUUN9JSIpLAogICAgICAgZmlsbCA9ICJJbnRlcnZlbnRpb24gdGltZXBvaW50IiwKICAgICAgIHRpdGxlID0gIlByaW5jaXBhbCBDb21wb25lbnRzIEFuYWx5c2lzIFNjb3JlcyBQbG90IiwKICAgICAgIHN1YnRpdGxlID0gIkxvZzIgdHJhbnNmb3JtZWQgTEMtTVMgbGlwaWRvbWljcyBkYXRhIChFU0kgLSkgZmFjZXRlZCBieSB0cmVhdG1lbnQgZ3JvdXAiKSArCiAgIGZhY2V0X3dyYXAoIH4gdHJlYXRtZW50LCBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKHRydF9sYWJlbHMpKSkKCmBgYAoKCkV4cG9ydCBwbG90CmBgYHtyfQpnZ3NhdmUocGxvdCA9IFBDQV9mYWNldGVkX25vUUNzMiwKICAgICAgIGZpbGVuYW1lID0gInBsb3RzIGFuZCBmaWd1cmVzL1BDQS1mYWNldGVkLWJ5LWdyb3VwLWxpcGlkb21pY3NORUcuc3ZnIiwKICAgICAgIGJnID0gInRyYW5zcGFyZW50IiwKICAgICAgIGhlaWdodCA9IDQsCiAgICAgICB3aWR0aCA9IDgpCmBgYAoKCgpgYGB7cn0KUENfY29vcmRfbm9RQ3NfbG9nMiAlPiUKICAgZ2dwbG90KGFlcyh4ID0gRGltLjEsIHkgPSBEaW0uMiwKICAgICAgICAgICAgIGZpbGwgPSBzZXgsCiAgICAgICAgICAgICB0ZXh0ID0gc2FtcGxlKSkgKwogICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGFscGhhID0gMC44KSArCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhPTAuNSkgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCAiYmx1ZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9ICJibGFjayIpICsgIAogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZpeGVkKFBDMl9ub1FDL1BDMV9ub1FDKSArCiAgbGFicyh4ID0gZ2x1ZTo6Z2x1ZSgiUEMxOiB7UEMxX25vUUN9JSIpLAogICAgICAgeSA9IGdsdWU6OmdsdWUoIlBDMjoge1BDMl9ub1FDfSUiKSwKICAgICAgIGZpbGwgPSAic2V4IiwKICAgICAgIHRpdGxlID0gIlByaW5jaXBhbCBDb21wb25lbnRzIEFuYWx5c2lzIFNjb3JlcyBQbG90IiwKICAgICAgIHN1YnRpdGxlID0gIkxvZzIgdHJhbnNmb3JtZWQgZGF0YSwgTm8gUUNzIikgKwogIGZhY2V0X3dyYXAoIH4gdHJlYXRtZW50KSArCiAgIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSkKYGBgCgojIyMgRmFjZXRlZCBieSBzZXgKYGBge3J9CihQQ19jb29yZF9mYWNldHNleCA8LSBQQ19jb29yZF9ub1FDc19sb2cyICU+JQogICBnZ3Bsb3QoYWVzKHggPSBEaW0uMSwgeSA9IERpbS4yLAogICAgICAgICAgICAgZmlsbCA9IHRyZWF0bWVudF9wZXJpb2QsCiAgICAgICAgICAgICB0ZXh0ID0gc2FtcGxlKSkgKwogICBnZW9tX3BvaW50KHNoYXBlID0gMjEsIGFscGhhID0gMC44KSArCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhPTAuNSkgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBhbHBoYT0wLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrc2VhZ3JlZW4yIiwgImRhcmtncmVlbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhbjMiLCAib3JhbmdlcmVkMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF2ZW5kZXJibHVzaDMiLCAiZGFya3JlZCIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9ICJibGFjayIpICsgIAogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZpeGVkKFBDMl9ub1FDL1BDMV9ub1FDKSArCiAgbGFicyh4ID0gZ2x1ZTo6Z2x1ZSgiUEMxOiB7UEMxX25vUUN9JSIpLAogICAgICAgeSA9IGdsdWU6OmdsdWUoIlBDMjoge1BDMl9ub1FDfSUiKSwKICAgICAgIGZpbGwgPSAic2V4IiwKICAgICAgIHRpdGxlID0gIlByaW5jaXBhbCBDb21wb25lbnRzIEFuYWx5c2lzIFNjb3JlcyBQbG90IiwKICAgICAgIHN1YnRpdGxlID0gIkxvZzIgdHJhbnNmb3JtZWQgZGF0YSwgTm8gUUNzIikgKwogIGZhY2V0X3dyYXAoIH4gc2V4KSArCiAgIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiKSkpCgpnZ3Bsb3RseShQQ19jb29yZF9mYWNldHNleCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCgoKIyBNdWx0aWxldmVsIFBDQQoKVGhpcyB0eXBlIG9mIFBDQSBhY2NvdW50cyBmb3IgdGhlIHN0cnVjdHVyZSBvZiBwYWlyZWQgZGF0YSwgYWxsb3dpbmcgZm9yIGEgbW9yZSBhY2N1cmF0ZSBhc3Nlc3NtZW50IG9mIGJpb2xvZ2ljYWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0cmVhdG1lbnQgZ3JvdXBzLCBub3QgZGlmZmVyZW5jZXMgYXR0cmlidXRlZCB0byB0aGUgbmF0dXJhbCB2YXJpYXRpb24gYmV0d2VlbiBpbmRpdmlkdWFscy4KClNlZSBodHRwOi8vbWl4b21pY3Mub3JnL21ldGhvZHMvbXVsdGlsZXZlbC8gZm9yIG1vcmUgaW5mby4KCiMjIFdyYW5nbGUKCmBgYHtyfQoKRGF0YV9mb3JNUENBIDwtIERDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyX25vUUNzICU+JQogIG11dGF0ZV9hdCgic3ViamVjdCIsIGFzLmZhY3RvcikgJT4lCiAgbXV0YXRlKHNhbXBsZTIgPSBzYW1wbGUsCiAgICAgICAgIGJfYyA9IGNhcm90ZW5vaWRzJGJfY19ubW9sX2xfcGxhc21hLAogICAgICAgICBseWMgPSBjYXJvdGVub2lkcyRseWNfbm1vbF9sX3BsYXNtYSwKICAgICAgICAgYXBvMTNvbmUgPSBjYXJvdGVub2lkcyRhcG8xM29uZV9ubW9sX2xfcGxhc21hLAogICAgICAgICByZXRpbm9sID0gY2Fyb3Rlbm9pZHMkcmV0aW5vbF9ubW9sX2xfcGxhc21hLAogICAgICAgICB0b3RhbF9jYXJvdCA9IGNhcm90ZW5vaWRzJHRvdGFsX2Nhcm90ZW5vaWRzKSAlPiUKICBtdXRhdGVfYXQoInNhbXBsZTIiLCBzdHJfc3ViLCBzdGFydD03LCBlbmQ9OCkgJT4lCiAgbXV0YXRlKHBlcmlvZCA9IHNhbXBsZTIpICU+JQogIGRwbHlyOjpzZWxlY3QoYygxOjE0KSwgcGVyaW9kLCBiX2MsIGx5YywgYXBvMTNvbmUsIHJldGlub2wsIHRvdGFsX2Nhcm90LCBldmVyeXRoaW5nKCkpICU+JQogIGRwbHlyOjpzZWxlY3QoIXNhbXBsZTIpCiAKCnN1bW1hcnkoYXMuZmFjdG9yKERhdGFfZm9yTVBDQSRzdWJqZWN0KSkKCiMgbWFrZSBhIHZlY3RvciBmb3IgbWV0YSB2YXJpYWJsZXMKKG1ldGF2YXIgPC0gRGF0YV9mb3JNUENBWyxjKDE6MjApXSAlPiUKICAgIGNvbG5hbWVzKCkpCmBgYAoKIyMgUmVndWxhciBQQ0EKYGBge3J9Cm1peE9taWNzUENBLnJlc3VsdCA8LSBtaXhPbWljczo6cGNhKERhdGFfZm9yTVBDQVssIW5hbWVzKERhdGFfZm9yTVBDQSkgJWluJSBtZXRhdmFyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBGQUxTRSkKCnBsb3RJbmRpdihtaXhPbWljc1BDQS5yZXN1bHQsIAogICAgICAgICAgaW5kLm5hbWVzID0gRGF0YV9mb3JNUENBJHN1YmplY3QsIAogICAgICAgICAgZ3JvdXAgPSBEYXRhX2Zvck1QQ0EkdHJlYXRtZW50LCAKICAgICAgICAgIGxlZ2VuZCA9IFRSVUUsIAogICAgICAgICAgbGVnZW5kLnRpdGxlID0gIlRyZWF0bWVudCIsIAogICAgICAgICAgdGl0bGUgPSAnUmVndWxhciBQQ0EsIExpcGlkb21pY3MgQzE4ICgtKScpCgpgYGAKCgojIyBNdWx0aWxldmVsIFBDQQoKV2l0aCBhbGwgZGF0YQpgYGB7cn0KbXVsdGlsZXZlbFBDQS5yZXN1bHQgPC0gbWl4T21pY3M6OnBjYShEYXRhX2Zvck1QQ0FbLC0oYygxOjIwKSldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGV2ZWwgPSBEYXRhX2Zvck1QQ0Ekc3ViamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBGQUxTRSxuY29tcCA9IDEwKQoKcGxvdEluZGl2KG11bHRpbGV2ZWxQQ0EucmVzdWx0LCAKICAgICAgICAgIGluZC5uYW1lcyA9IERhdGFfZm9yTVBDQSRwZXJpb2QsIAogICAgICAgICAgZ3JvdXAgPSBEYXRhX2Zvck1QQ0EkdHJlYXRtZW50LCAKICAgICAgICAgIGxlZ2VuZCA9IFRSVUUsIAogICAgICAgICAgbGVnZW5kLnRpdGxlID0gIlRyZWF0bWVudCIsIAogICAgICAgICAgdGl0bGUgPSAnTXVsdGlsZXZlbCBQQ0EsIExpcGlkb21pY3MgQzE4ICgtKScsY29tcCA9IGMoMSwyKSkKCgpgYGAKCgoKIyMjIExvYWRpbmdzIApgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpwbG90TG9hZGluZ3MobXVsdGlsZXZlbFBDQS5yZXN1bHQsIG5kaXNwbGF5ID0gMzApCmBgYAoKCiMgc1BMUy1EQQoKRm9sbG93aW5nIGh0dHA6Ly9taXhvbWljcy5vcmcvY2FzZS1zdHVkaWVzL3NwbHNkYS1zcmJjdC1jYXNlLXN0dWR5LwoKCgpgYGB7ciwgZXZhbD1GQUxTRX0KbWF0X0RhdGFfZm9yTVBDQSA8LSBEYXRhX2Zvck1QQ0EgJT4lCiAgZHBseXI6OnNlbGVjdCghbWV0YXZhcikgJT4lCiAgYXMubWF0cml4KCkKICAKCmNsYXNzX2Zvck1QQ0EgPC0gRGF0YV9mb3JNUENBJHRyZWF0bWVudCAlPiUKICBhcy5mYWN0b3IoKQoKIyBjaGVja2luZyBkaW1lbnNpb25zIG9mIGZlYXR1cmUgYWJ1bmRhbmNlIG1hdHJpeApkaW0obWF0X0RhdGFfZm9yTVBDQSkKCiMgY2hlY2tpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0cmVhdG1lbnQgZ3JvdXAKc3VtbWFyeShjbGFzc19mb3JNUENBKQpgYGAKCiMjIEluaXRpYWwgbW9kZWwKCiJBIFBMUy1EQSBtb2RlbCBpcyBmaXR0ZWQgd2l0aCB0ZW4gY29tcG9uZW50cyB0byBldmFsdWF0ZSB0aGUgcGVyZm9ybWFuY2UgYW5kIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBuZWNlc3NhcnkgZm9yIHRoZSBmaW5hbCBtb2RlbC4iCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc3Bsc2RhIDwtIHNwbHNkYShtYXRfRGF0YV9mb3JNUENBLCBjbGFzc19mb3JNUENBLCBuY29tcCA9IDMpICAjIHNldCBuY29tcCB0byAxMCBmb3IgcGVyZm9ybWFuY2UgYXNzZXNzbWVudCBsYXRlcgpgYGAKCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBwbG90IHRoZSBzYW1wbGVzIHByb2plY3RlZCBvbnRvIHRoZSBmaXJzdCB0d28gY29tcG9uZW50cyBvZiB0aGUgUExTLURBIHN1YnNwYWNlCnBsb3RJbmRpdihzcGxzZGEgLCBjb21wID0gMToyLCAKICAgICAgICAgIGdyb3VwID0gY2xhc3NfZm9yTVBDQSwgaW5kLm5hbWVzID0gRkFMU0UsICAjIGNvbG91ciBwb2ludHMgYnkgY2xhc3MKICAgICAgICAgIGVsbGlwc2UgPSBUUlVFLCAjIGluY2x1ZGUgOTUlIGNvbmZpZGVuY2UgZWxsaXBzZSBmb3IgZWFjaCBjbGFzcwogICAgICAgICAgbGVnZW5kID0gVFJVRSwgdGl0bGUgPSAnKGEpIFBMU0RBIHdpdGggY29uZmlkZW5jZSBlbGxpcHNlcycpCgojIHVzZSB0aGUgbWF4LmRpc3QgbWVhc3VyZSB0byBmb3JtIGRlY2lzaW9uIGJvdW5kYXJpZXMgYmV0d2VlbiBjbGFzc2VzIGJhc2VkIG9uIFBMUy1EQSBkYXRhCmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kLnByZWRpY3Qoc3Bsc2RhLCBjb21wLnByZWRpY3RlZD0yLCBkaXN0ID0gIm1heC5kaXN0IikKCiMgcGxvdCB0aGUgc2FtcGxlcyBwcm9qZWN0ZWQgb250byB0aGUgZmlyc3QgdHdvIGNvbXBvbmVudHMgb2YgdGhlIFBMUy1EQSBzdWJzcGFjZQpwbG90SW5kaXYoc3Bsc2RhLCBjb21wID0gMToyLAogICAgICAgICAgZ3JvdXAgPSBjbGFzc19mb3JNUENBLCBpbmQubmFtZXMgPSBGQUxTRSwgIyBjb2xvdXIgcG9pbnRzIGJ5IGNsYXNzCiAgICAgICAgICBiYWNrZ3JvdW5kID0gYmFja2dyb3VuZCwgIyBpbmNsdWRlIHByZWRpY3Rpb24gYmFja2dyb3VuZCBmb3IgZWFjaCBjbGFzcwogICAgICAgICAgbGVnZW5kID0gVFJVRSwgdGl0bGUgPSAiIChiKSBQTFNEQSB3aXRoIHByZWRpY3Rpb24gYmFja2dyb3VuZCIpCmBgYAoKCgoKCiMjIE1vZGVsIHR1bmluZwoKYGBge3IsIGV2YWw9RkFMU0V9CiMgdW5kZXJnbyBwZXJmb3JtYW5jZSBldmFsdWF0aW9uIGluIG9yZGVyIHRvIHR1bmUgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIHVzZQpwZXJmLnNwbHNkYSA8LSBwZXJmKHNwbHNkYSwgdmFsaWRhdGlvbiA9ICJsb28iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkcyA9IDUsIG5yZXBlYXQgPSAxMDAsICMgdXNlIHJlcGVhdGVkIGNyb3NzLXZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0JhciA9IEZBTFNFLCBhdWMgPSBUUlVFKSAjIGluY2x1ZGUgQVVDIHZhbHVlcwoKIyBwbG90IHRoZSBvdXRjb21lIG9mIHBlcmZvcm1hbmNlIGV2YWx1YXRpb24gYWNyb3NzIGFsbCB0ZW4gY29tcG9uZW50cwpwbG90KHBlcmYuc3Bsc2RhLCBjb2wgPSBjb2xvci5taXhvKDU6NyksIHNkID0gVFJVRSwKICAgICBsZWdlbmQucG9zaXRpb24gPSAiaG9yaXpvbnRhbCIpCgpwZXJmLnNwbHNkYSRjaG9pY2UubmNvbXAgIyB3aGF0IGlzIHRoZSBvcHRpbWFsIHZhbHVlIG9mIGNvbXBvbmVudHMgYWNjb3JkaW5nIHRvIHBlcmYoKQpgYGAKCgoKYGBge3IsIGV2YWw9RkFMU0V9CiMgZ3JpZCBvZiBwb3NzaWJsZSBrZWVwWCB2YWx1ZXMgdGhhdCB3aWxsIGJlIHRlc3RlZCBmb3IgZWFjaCBjb21wb25lbnQKbGlzdC5rZWVwWCA8LSBjKDE6MTAsICBzZXEoMjAsIDMwMCwgMTApKQoKIyB1bmRlcmdvIHRoZSB0dW5pbmcgcHJvY2VzcyB0byBkZXRlcm1pbmUgdGhlIG9wdGltYWwgbnVtYmVyIG9mIHZhcmlhYmxlcwp0dW5lLnNwbHNkYSA8LSB0dW5lLnNwbHNkYShtYXRfRGF0YV9mb3JNUENBLCBjbGFzc19mb3JNUENBLCBuY29tcCA9IDksICMgY2FsY3VsYXRlIGZvciBmaXJzdCA5IGNvbXBvbmVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbiA9ICdsb28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkcyA9IDUsIG5yZXBlYXQgPSAxMDAsICMgdXNlIHJlcGVhdGVkIGNyb3NzLXZhbGlkYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA9ICdtYXguZGlzdCcsICMgdXNlIG1heC5kaXN0IG1lYXN1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZSA9ICJCRVIiLCAjIHVzZSBiYWxhbmNlZCBlcnJvciByYXRlIG9mIGRpc3QgbWVhc3VyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LmtlZXBYID0gbGlzdC5rZWVwWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1cyA9IDIpICMgYWxsb3cgZm9yIHBhcmFsbGVsaXphdGlvbiB0byBkZWNyZWFzZSBydW50aW1lCgpwbG90KHR1bmUuc3Bsc2RhLCBjb2wgPSBjb2xvci5qZXQoOSkpICMgcGxvdCBvdXRwdXQgb2YgdmFyaWFibGUgbnVtYmVyIHR1bmluZwpgYGAKCiMgc1BDQQoKYGBge3J9CnJlc3VsdC5zUENBLm11bHRpIDwtIHNwY2EoRGF0YV9mb3JNUENBWywhbmFtZXMoRGF0YV9mb3JNUENBKSAlaW4lIG1ldGF2YXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBYID0gYygxMCwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGV2ZWwgPSBEYXRhX2Zvck1QQ0Ekc3ViamVjdCkKCgpwbG90SW5kaXYocmVzdWx0LnNQQ0EubXVsdGksCiAgICAgICAgICBpbmQubmFtZXMgPSBEYXRhX2Zvck1QQ0EkcGVyaW9kLCAKICAgICAgICAgIGdyb3VwID0gRGF0YV9mb3JNUENBJHRyZWF0bWVudCwgCiAgICAgICAgICBsZWdlbmQgPSBUUlVFLCAKICAgICAgICAgIGxlZ2VuZC50aXRsZSA9ICJUcmVhdG1lbnQiLCAKICAgICAgICAgIHRpdGxlID0gJ011bHRpbGV2ZWwgc1BDQSwgTGlwaWRvbWljcyBDMTggKC0pJyxjb21wID0gYygxLDIpKQoKcGxvdFZhcihyZXN1bHQuc1BDQS5tdWx0aSkgIApgYGAKCgoKYGBge3J9CnNlbGVjdFZhcihyZXN1bHQuc1BDQS5tdWx0aSwgY29tcCA9IDEpJG5hbWUKCnBsb3RMb2FkaW5ncyhyZXN1bHQuc1BDQS5tdWx0aSwgbWV0aG9kID0gIm1lYW4iLCBjb250cmliID0gIm1heCIpCmBgYAoKCiMgUENBdG9vbHMKCiMjIyBEYXRhIHdyYW5nbGluZwpgYGB7cn0KIyBjcmVhdGUgcmVsIGFidW5kIGRmIHN1aXRhYmxlIGZvciBQQ0F0b29scyBwYWNrYWdlCmltcF9jbHVzdF9vbWljc2RhdGFfZm9yUENBdG9vbHMgPC0gRGF0YV9mb3JNUENBICU+JQogICMgc2VsZWN0IG9ubHkgc2FtcGxlIElEIGFuZCBmZWF0dXJlIGNvbHVtbnMKICBkcGx5cjo6c2VsZWN0KHNhbXBsZSwKICAgICAgICAgICAgICAgIDIxOm5jb2woLikpICU+JQogICMgdHJhbnNwb3NlCiAgdCgpICU+JQogICMgY29udmVydCBiYWNrIHRvIGRmCiAgYXMuZGF0YS5mcmFtZSgpCgpuYW1lcyhpbXBfY2x1c3Rfb21pY3NkYXRhX2ZvclBDQXRvb2xzKSA8LSBpbXBfY2x1c3Rfb21pY3NkYXRhX2ZvclBDQXRvb2xzWzEsXSAjIG1ha2Ugc2FtcDtlIElEcyBjb2x1bW4gbmFtZXMKCmltcF9jbHVzdF9vbWljc2RhdGFfZm9yUENBdG9vbHMgPC0gaW1wX2NsdXN0X29taWNzZGF0YV9mb3JQQ0F0b29sc1stMSxdICMgcmVtb3ZlIHNhbXBsZSBJRCByb3cKCiMgY3JlYXRlIG1ldGFkYXRhIGRmIHN1aXRhYmxlIGZvciBQQ0F0b29scyBwY2tnCgptZXRhZGF0YV9mb3JQQ0F0b29scyA8LSBEYXRhX2Zvck1QQ0FbLDE6MjBdCgptZXRhZGF0YV9mb3JQQ0F0b29scyA8LSBtZXRhZGF0YV9mb3JQQ0F0b29scyAlPiUKICB1bml0ZSgidHJlYXRtZW50X3BlcmlvZCIsIGMoInRyZWF0bWVudCIsICJwZXJpb2QiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzYW1wbGUiKQogIAoKIyBjcmVhdGUgYSB2ZWN0b3Igc28gdGhhdCBjb2wgbmFtZXMgaW4gYWJ1bmRhbmNlIGRmIG1hdGNoZXMgbWV0YWRhdGEgZGYKb3JkZXJfZm9yUENBdG9vbHMgPC0gbWF0Y2goY29sbmFtZXMoaW1wX2NsdXN0X29taWNzZGF0YV9mb3JQQ0F0b29scyksIHJvd25hbWVzKG1ldGFkYXRhX2ZvclBDQXRvb2xzKSkKCiMgcmVvcmRlciBjb2wgbmFtZXMgaW4gYWJ1bmRhbmNlIGRmIHNvIHRoYXQgaXQgbWF0Y2hlcyBtZXRhZGF0YQpsb2cyX2FidW5kYW5jZXNfcmVvcmRlcmVkX2ZvclBDQXRvb2xzIDwtIGltcF9jbHVzdF9vbWljc2RhdGFfZm9yUENBdG9vbHNbLG9yZGVyX2ZvclBDQXRvb2xzXSAlPiUKICAjIGNoYW5nZSBhYnVuZGFuY2UgZGYgdG8gbnVtZXJpYwogIG11dGF0ZV9hbGwoYXMubnVtZXJpYykKCmBgYAoKCiMjIyBQQ0EKCiMjIyMgY29sYnkgdHJ0CmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9OH0KIyBwY2EKcCA8LSBQQ0F0b29sczo6cGNhKGxvZzJfYWJ1bmRhbmNlc19yZW9yZGVyZWRfZm9yUENBdG9vbHMsCiAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhX2ZvclBDQXRvb2xzLAogICAgICAgICAgICAgICAgICAgc2NhbGUgPSBGQUxTRSwgIyB1c2luZyBzY2FsZWQgZGF0YSBhbHJlYWR5IChsb2cyIHRyYW5zZm9ybWVkKQogICAgICAgICAKKQoKYmlwbG90KHAsIAogICAgICAgbGFiID0gcGFzdGUwKG1ldGFkYXRhX2ZvclBDQXRvb2xzJHN1YmplY3QpLAogICAgICAgY29sYnkgPSAndHJlYXRtZW50JywKICAgICAgIGNvbGtleSA9IGMoImNvbnRyb2wiID0gImxpZ2h0Z3JlZW4iLAogICAgICAgICAgICAgICAgICAiYmV0YSIgPSAib3JhbmdlIiwKICAgICAgICAgICAgICAgICAgInJlZCIgPSAidG9tYXRvIiksCiAgICAgICBobGluZSA9IDAsIHZsaW5lID0gMCwKICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywKICAgICAgIHRpdGxlID0gIlBDQSBTY29yZXMgUGxvdCB3aXRoIExvYWRpbmdzIiwKICAgICAgIHN1YnRpdGxlID0gIkxvZzIgdHJhbnNmb3JtZWQgZGF0YS4gOTUlIENJIGVsbGlwc2VzIiwKICAgICAgIGVsbGlwc2UgPSBUUlVFLAogICAgICAgZWxsaXBzZVR5cGUgPSAndCcsICMgYXNzdW1lcyBtdWx0aXZhcmlhdGUKICAgICAgIGVsbGlwc2VMZXZlbCA9IDAuOTUsCiAgICAgICBlbGxpcHNlRmlsbCA9IFRSVUUsCiAgICAgICBlbGxpcHNlQWxwaGEgPSAwLjIsCiAgICAgICBlbGxpcHNlTGluZVNpemUgPSAwLAogICAgICAgc2hvd0xvYWRpbmdzID0gVFJVRSxudG9wTG9hZGluZ3MgPSAxMCkKCmBgYAoKIyMjIyBjb2xieSBwZXJpb2QKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQojIHBjYQoKYmlwbG90KHAsCiAgICAgICBsYWIgPSBwYXN0ZTAobWV0YWRhdGFfZm9yUENBdG9vbHMkc3ViamVjdCksCiAgICAgICBjb2xieSA9ICdwZXJpb2QnLAogICAgICAgY29sa2V5ID0gYygiYjEiID0gImdyYXkiLAogICAgICAgICAgICAgICAgICAiYjMiID0gInBpbmsiKSwKICAgICAgIGhsaW5lID0gMCwgdmxpbmUgPSAwLAogICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgdGl0bGUgPSAiUENBIFNjb3JlcyBQbG90IHdpdGggTG9hZGluZ3MiLAogICAgICAgc3VidGl0bGUgPSAiTG9nMiB0cmFuc2Zvcm1lZCBkYXRhLiA5NSUgQ0kgZWxsaXBzZXMiLAogICAgICAgZWxsaXBzZSA9IFRSVUUsCiAgICAgICBlbGxpcHNlVHlwZSA9ICd0JywgIyBhc3N1bWVzIG11bHRpdmFyaWF0ZQogICAgICAgZWxsaXBzZUxldmVsID0gMC45NSwKICAgICAgIGVsbGlwc2VGaWxsID0gVFJVRSwKICAgICAgIGVsbGlwc2VBbHBoYSA9IDAuMiwKICAgICAgIGVsbGlwc2VMaW5lU2l6ZSA9IDAsCiAgICAgICBzaG93TG9hZGluZ3MgPSBUUlVFKQoKYGBgCgojIyMjIGNvbGJ5IHRydF9wZXJpb2QKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQoKYmlwbG90KHAsCiAgICAgICBsYWIgPSBwYXN0ZTAobWV0YWRhdGFfZm9yUENBdG9vbHMkc3ViamVjdCksCiAgICAgICBjb2xieSA9ICd0cmVhdG1lbnRfcGVyaW9kJywKICAgICAgIGNvbGtleSA9IGMoImNvbnRyb2xfYjEiID0gImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAiY29udHJvbF9iMyIgPSAiZGFya2dyZWVuIiwKICAgICAgICAgICAgICAgImJldGFfYjEiID0gInRhbjMiLAogICAgICAgICAgICAgICAiYmV0YV9iMyIgPSAib3JhbmdlcmVkMiIsCiAgICAgICAgICAgICAgICJyZWRfYjEiID0gImxhdmVuZGVyYmx1c2gzIiwKICAgICAgICAgICAgICAgInJlZF9iMyIgPSAiZGFya3JlZCIpLAogICAgICAgaGxpbmUgPSAwLCB2bGluZSA9IDAsCiAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsCiAgICAgICB0aXRsZSA9ICJQQ0EgU2NvcmVzIFBsb3Qgd2l0aCBMb2FkaW5ncyIsCiAgICAgICBzdWJ0aXRsZSA9ICJMb2cyIHRyYW5zZm9ybWVkIGRhdGEuIDk1JSBDSSBlbGxpcHNlcy4iLAogICAgICAgZWxsaXBzZSA9IFRSVUUsCiAgICAgICBlbGxpcHNlVHlwZSA9ICd0JywgIyBhc3N1bWVzIG11bHRpdmFyaWF0ZQogICAgICAgZWxsaXBzZUxldmVsID0gMC45NSwKICAgICAgIGVsbGlwc2VGaWxsID0gVFJVRSwKICAgICAgIGVsbGlwc2VBbHBoYSA9IDAuMiwKICAgICAgIGVsbGlwc2VMaW5lU2l6ZSA9IDAsCiAgICAgICBzaG93TG9hZGluZ3MgPSBUUlVFLCBudG9wTG9hZGluZ3MgPSAxMCkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQoKYmlwbG90KHAsCiAgICAgICBsYWIgPSBwYXN0ZTAobWV0YWRhdGFfZm9yUENBdG9vbHMkc3ViamVjdCksCiAgICAgICBjb2xieSA9ICd0cmVhdG1lbnRfcGVyaW9kJywKICAgICAgIGNvbGtleSA9IGMoImNvbnRyb2xfYjEiID0gImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAiY29udHJvbF9iMyIgPSAiZGFya2dyZWVuIiwKICAgICAgICAgICAgICAgImJldGFfYjEiID0gInRhbjMiLAogICAgICAgICAgICAgICAiYmV0YV9iMyIgPSAib3JhbmdlcmVkMiIsCiAgICAgICAgICAgICAgICJyZWRfYjEiID0gImxhdmVuZGVyYmx1c2gzIiwKICAgICAgICAgICAgICAgInJlZF9iMyIgPSAiZGFya3JlZCIpLAogICAgICAgaGxpbmUgPSAwLCB2bGluZSA9IDAsCiAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsCiAgICAgICB0aXRsZSA9ICJQQ0EgU2NvcmVzIFBsb3Qgd2l0aCBMb2FkaW5ncyIsCiAgICAgICBzdWJ0aXRsZSA9ICJMb2cyIHRyYW5zZm9ybWVkIGRhdGEuIDk1JSBDSSBlbGxpcHNlcy4iLAogICAgICAgc2hvd0xvYWRpbmdzID0gVFJVRSwgbnRvcExvYWRpbmdzID0gMTApCgpgYGAKCgoKTGV0J3MgZXhwbG9yZSBhIGxpdHRsZSBtb3JlCgoKSG93IG1hbnkgUENzIGRvIHdlIG5lZWQgdG8gY2FwdHVyZSBhdCBsZWFzdCA4MCUgdmFyaWFuY2U/CmBgYHtyfQp3aGljaChjdW1zdW0ocCR2YXJpYW5jZSkgPiA4MClbMV0KYGBgCgpUaGlzIHNob3dzIHdlJ2QgbmVlZCBxdWl0ZSBhIGZldyBQQ3MgdG8gY2FwdHVyZSBtb3N0IG9mIHRoZSB2YXJpYW5jZS4gCgoKIyMjIFBhaXJzIHBsb3RzCgpIZXJlLCB3ZSB3aWxsIGxvb2sgYXQgc2VwYXJhdGlvbnMgZm9yIHNldmVyYWwgY29tcG9uZW50cyBhdCBvbmNlIHVzaW5nIHBhaXJzIHBsb3RzLgoKIyMjIyB0cmVhdG1lbnRfcGVyaW9kCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CnBhaXJzcGxvdChwLAogICAgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHMocCwgYygxOjEwKSksCiAgICB0cmlhbmdsZSA9IFRSVUUsIHRyaWFuZ2xlbGFiU2l6ZSA9IDEyLAogICAgaGxpbmUgPSAwLCB2bGluZSA9IDAsCiAgICBwb2ludFNpemUgPSAwLjQsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UsCiAgICBjb2xieSA9ICd0cmVhdG1lbnRfcGVyaW9kJywKICAgIGNvbGtleSA9IGMoImNvbnRyb2xfYjEiID0gImRhcmtzZWFncmVlbjIiLAogICAgICAgICAgICAgICAiY29udHJvbF9iMyIgPSAiZGFya2dyZWVuIiwKICAgICAgICAgICAgICAgImJldGFfYjEiID0gInRhbiIsCiAgICAgICAgICAgICAgICJiZXRhX2IzIiA9ICJvcmFuZ2VyZWQyIiwKICAgICAgICAgICAgICAgInJlZF9iMSIgPSAibGF2ZW5kZXJibHVzaDMiLAogICAgICAgICAgICAgICAicmVkX2IzIiA9ICJkYXJrcmVkIiksCiAgICB0aXRsZSA9ICdQYWlycyBwbG90JywgcGxvdGF4ZXMgPSBGQUxTRSwKICAgIG1hcmdpbmdhcHMgPSB1bml0KGMoLTAuMDEsIC0wLjAxLCAtMC4wMSwgLTAuMDEpLCAnY20nKSkKCmBgYAoKCiMjIyMgcGVyaW9kIAoKYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMH0KcGFpcnNwbG90KHAsCiAgICBjb21wb25lbnRzID0gZ2V0Q29tcG9uZW50cyhwLCBjKDE6MTApKSwKICAgIHRyaWFuZ2xlID0gVFJVRSwgdHJpYW5nbGVsYWJTaXplID0gMTIsCiAgICBobGluZSA9IDAsIHZsaW5lID0gMCwKICAgIHBvaW50U2l6ZSA9IDAuNCwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLCBncmlkbGluZXMubWlub3IgPSBGQUxTRSwKICAgIGNvbGJ5ID0gJ3BlcmlvZCcsCiAgICBjb2xrZXkgPSBjKCJiMSIgPSAiZGFya2dyYXkiLAogICAgICAgICAgICAgICAiYjMiID0gInBpbmsiKSwKICAgIHRpdGxlID0gJ1BhaXJzIHBsb3QnLCBwbG90YXhlcyA9IEZBTFNFLAogICAgbWFyZ2luZ2FwcyA9IHVuaXQoYygtMC4wMSwgLTAuMDEsIC0wLjAxLCAtMC4wMSksICdjbScpKQoKYGBgCgoKIyMjIyBzZXgKQXJlIHRoZXJlIGFueSBvYnZpb3VzIGNsdXN0ZXJpbmdzIHdoZW4gY29sb3JlZCBieSBzZXg/CgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQogIHBhaXJzcGxvdChwLAogICAgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHMocCwgYygxOjEwKSksCiAgICB0cmlhbmdsZSA9IFRSVUUsIHRyaWFuZ2xlbGFiU2l6ZSA9IDEyLAogICAgaGxpbmUgPSAwLCB2bGluZSA9IDAsCiAgICBwb2ludFNpemUgPSAwLjQsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UsCiAgICBjb2xieSA9ICdzZXgnLCAKICAgIGNvbGtleSA9IGMoIk0iID0gInJlZCIsCiAgICAgICAgICAgICAgICJGIiA9ICJwdXJwbGUiKSwKICAgIHRpdGxlID0gJ1BhaXJzIHBsb3QnLCBwbG90YXhlcyA9IEZBTFNFLAogICAgbWFyZ2luZ2FwcyA9IHVuaXQoYygtMC4wMSwgLTAuMDEsIC0wLjAxLCAtMC4wMSksICdjbScpKQpgYGAKCgoKIyMgRWlnZW4gY29ycGxvdHMKClRoaXMgaXMgYSBjb29sIHdheSB0byBleHBsb3JlIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgbWV0YWRhdGEgYW5kIHRoZSBQQ3MhIEkgd2FudCB0byBsb29rIGF0IGhvdyB0aGUgbWV0YXZhcmlhYmxlcyBjb3JyZWxhdGUgd2l0aCBQQ3MgdGhhdCBhY2NvdW50IGZvciA4MCUgdmFyaWF0aW9uIGluIHRoZSBkYXRhc2V0LiAKCkFnYWluOiBIb3cgbWFueSBQQ3MgZG8gd2UgbmVlZCB0byBjYXB0dXJlIGF0IGxlYXN0IDgwJSB2YXJpYW5jZT8KYGBge3J9CndoaWNoKGN1bXN1bShwJHZhcmlhbmNlKSA+IDgwKVsxXQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Ny41fQogIGVpZ2VuY29ycGxvdChwLAogICAgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHMocCwgMTp3aGljaChjdW1zdW0ocCR2YXJpYW5jZSkgPiA4MClbMV0pLCAjIGdldCBjb21wb25lbnRzIHRoYXQgYWNjb3VudCBmb3IgODAlIHZhcmlhbmNlCiAgICBtZXRhdmFycyA9IGNvbG5hbWVzKG1ldGFkYXRhX2ZvclBDQXRvb2xzKSwKICAgIGNvbCA9IGMoJ2RhcmtibHVlJywgJ2JsdWUyJywgJ2dyYXknLCAncmVkMicsICdkYXJrcmVkJyksCiAgICBjZXhDb3J2YWwgPSAwLjcsCiAgICBjb2xDb3J2YWwgPSAnd2hpdGUnLAogICAgZm9udENvcnZhbCA9IDIsCiAgICBwb3NMYWIgPSAnYm90dG9tbGVmdCcsCiAgICByb3RMYWJYID0gNDUsCiAgICBwb3NDb2xLZXkgPSAndG9wJywKICAgIGNleExhYkNvbEtleSA9IDEuNSwKICAgIHNjYWxlID0gVFJVRSwKICAgIG1haW4gPSAnUEMxLTE1IG1ldGFkYXRhIGNvcnJlbGF0aW9ucycsCiAgICBjb2xGcmFtZSA9ICd3aGl0ZScsCiAgICBwbG90UnNxdWFyZWQgPSBGQUxTRSkKYGBgCgoKYGBge3IsIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD03LjV9CiAgZWlnZW5jb3JwbG90KHAsCiAgICBjb21wb25lbnRzID0gZ2V0Q29tcG9uZW50cyhwLCAxOndoaWNoKGN1bXN1bShwJHZhcmlhbmNlKSA+IDgwKVsxXSksCiAgICBtZXRhdmFycyA9IGNvbG5hbWVzKG1ldGFkYXRhX2ZvclBDQXRvb2xzKSwKICAgIGNvbCA9IGMoJ3doaXRlJywgJ2Nvcm5zaWxrMScsICdnb2xkJywgJ2ZvcmVzdGdyZWVuJywgJ2RhcmtncmVlbicpLAogICAgY2V4Q29ydmFsID0gMS4yLAogICAgZm9udENvcnZhbCA9IDIsCiAgICBwb3NMYWIgPSAnYWxsJywKICAgIHJvdExhYlggPSA0NSwKICAgIHNjYWxlID0gVFJVRSwKICAgIG1haW4gPSBicXVvdGUoUHJpbmNpcGFsIH4gY29tcG9uZW50IH4gU3BlYXJtYW4gfiByXjIgfiBtZXRhZGF0YSB+IGNvcnJlbGF0ZXMpLAogICAgcGxvdFJzcXVhcmVkID0gVFJVRSwKICAgIGNvckZVTiA9ICdzcGVhcm1hbicsCiAgICBjb3JVU0UgPSAncGFpcndpc2UuY29tcGxldGUub2JzJywKICAgIGNvck11bHRpcGxlVGVzdENvcnJlY3Rpb24gPSAnQkgnLAogICAgc2lnbmlmU3ltYm9scyA9IGMoJyoqKionLCAnKioqJywgJyoqJywgJyonLCAnJyksCiAgICBzaWduaWZDdXRwb2ludHMgPSBjKDAsIDAuMDAwMSwgMC4wMDEsIDAuMDEsIDAuMDUsIDEpKQpgYGAKCiMgVW5pdmFyaWF0ZSBhbmFseXNpcwoKIyMgV3JhbmdsZSBkYXRhCgpgYGB7cn0KCiMgdXNpbmcgdGhlIG1vc3QgY29udmVuaWVudCBkZiB0byBjb252ZXJ0IHRvIHRpZHkKZGZfZm9yX3N0YXRzIDwtIERhdGFfZm9yTVBDQSAlPiUKICBwaXZvdF9sb25nZXIoMjE6bmNvbCguKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAibXpfcnQiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVsX2FidW5kX2xvZzIiKSAlPiUKICB1bml0ZSgidHJlYXRtZW50X3BlcmlvZCIsICJ0cmVhdG1lbnQiLCAicGVyaW9kIiwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgbXV0YXRlX2F0KCJ0cmVhdG1lbnQiLCBhcy5mYWN0b3IpCmBgYAoKYGBge3J9CiMgdHVybiBvZmYgc2NpIG5vdGF0aW9uIG91dHB1dHMKb3B0aW9ucyhzY2lwZW4gPSA5OTkpCmBgYAoKIyMgUGFyYW1ldHJpYyB0ZXN0cwoKIyMjIEFOT1ZBIGFjcm9zcyB0cmVhdG1lbnQgdGltZXBvaW50cwoKYGBge3IsIGFub3ZhIHRyZWF0bWVudH0KZGZfZm9yX3N0YXRzJHRyZWF0bWVudF9wZXJpb2QgPC0gYXMuZmFjdG9yKGRmX2Zvcl9zdGF0cyR0cmVhdG1lbnRfcGVyaW9kKQoKdHJ0X2Fub3ZhX291dHB1dF9kZiA8LSBkZl9mb3Jfc3RhdHMgJT4lIAogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdCwgc2FtcGxlLCB0cmVhdG1lbnRfcGVyaW9kLCBtel9ydCwgcmVsX2FidW5kX2xvZzIpICU+JQogIGdyb3VwX2J5KG16X3J0KSAlPiUKICBhbm92YV90ZXN0KHJlbF9hYnVuZF9sb2cyIH4gdHJlYXRtZW50X3BlcmlvZCwgd2lkID0gc3ViamVjdCwKICAgICAgICAgICAgIGRldGFpbGVkID0gVFJVRSkgJT4lCiAgYWRqdXN0X3B2YWx1ZShtZXRob2QgPSAiQkgiKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKCgp0cnRfYW5vdmFfc2lnIDwtIHRydF9hbm92YV9vdXRwdXRfZGYgJT4lCiAgZmlsdGVyKHAuYWRqIDwgLjA1KQoKaGVhZCh0cnRfYW5vdmFfc2lnKQoKIyBob3cgbWFueSBzaWduaWZpY2FudCBmZWF0dXJlcz8KbnJvdyh0cnRfYW5vdmFfc2lnKQoKYGBgCgpgYGB7cn0KdHJ0X3BlcmlvZF9BTk9WQV90dWtleSA8LSBkZl9mb3Jfc3RhdHMgJT4lIAogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdCwgc2FtcGxlLCB0cmVhdG1lbnRfcGVyaW9kLCBtel9ydCwgcmVsX2FidW5kX2xvZzIpICU+JQogIGdyb3VwX2J5KG16X3J0KSAlPiUKICB0dWtleV9oc2QocmVsX2FidW5kX2xvZzIgfiB0cmVhdG1lbnRfcGVyaW9kLCB3aWQgPSBzdWJqZWN0KQoKdHJ0X3R1a2V5SFNEX3NpZyA8LSB0cnRfcGVyaW9kX0FOT1ZBX3R1a2V5ICU+JQogIGZpbHRlcihwLmFkaiA8IC4wNSkKYGBgCgojIyMgdCB0ZXN0cyAodW5wYWlyZWQgYW5kIHBhaXJlZCkKCiMjIyMgUGFpcmVkIGNvbnRyb2wKCmBgYHtyfQojIHJ1biBwYWlyZWQgdC10ZXN0cyBmb3IgY29udHJvbCBpbnRlcnZlbnRpb24KY3RybF90LnRlc3RfcGFpcmVkIDwtIGRmX2Zvcl9zdGF0cyAlPiUKICBmaWx0ZXIodHJlYXRtZW50ID09ICJjb250cm9sIikgJT4lCiBkcGx5cjo6c2VsZWN0KHN1YmplY3QsIHBlcmlvZCwgbXpfcnQsIHJlbF9hYnVuZF9sb2cyKSAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgdF90ZXN0KHJlbF9hYnVuZF9sb2cyIH4gcGVyaW9kLCAKICAgICAgICAgcGFpcmVkID0gVFJVRSwgCiAgICAgICAgIHAuYWRqdXN0Lm1ldGhvZCA9ICJCSCIpICU+JSAjIEJlbmphbWluaS1Ib2NoYmVyZyBjb250cm9sbGluZyB0byBsb3dlciBmYWxzZSBwb3NpdGl2ZXMKICBhZGRfc2lnbmlmaWNhbmNlKCkKYGBgCgpTdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZlYXR1cmVzCgpgYGB7cn0KIyB3aGljaCBmZWF0dXJlcyBhcmUgc2lnbmlmaWNhbnQ/CmN0cmxfdC50ZXN0X3BhaXJlZF9zaWcgPC0gY3RybF90LnRlc3RfcGFpcmVkICU+JQogIGZpbHRlcihwIDwgMC4wNSkKa2FibGUoY3RybF90LnRlc3RfcGFpcmVkX3NpZykKCiMgaG93IG1hbnkgYXJlIHNpZ25pZmljYW50Pwpucm93KGN0cmxfdC50ZXN0X3BhaXJlZF9zaWcpCmBgYAoKIyMjIyMgQU5PVkEgb3ZlcmxhcAoKS2VlcCBzaWcgZmVhdHVyZXMgaW4gdC10ZXN0IHRoYXQgaGF2ZSBhIG1hdGNoIGluIHNpZyBBTk9WQQoKYGBge3J9CnNpZ19vdmVybGFwX2N0cmxfcGFpcmVkIDwtIGlubmVyX2pvaW4oY3RybF90LnRlc3RfcGFpcmVkX3NpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnRfdHVrZXlIU0Rfc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCIudC10ZXN0IiwgIi50dWtleXMiKSkKYGBgCgojIyMjIyBNdW1taWNob2cgbGlzdAoKYGBge3J9CnBhaXJlZF9jdHJsX2Zvcl9tdW1taWNob2cgPC0gY3RybF90LnRlc3RfcGFpcmVkICU+JQogIGRwbHlyOjpzZWxlY3QobXpfcnQsCiAgICAgICAgIHAsCiAgICAgICAgIHN0YXRpc3RpYykgJT4lCiAgc2VwYXJhdGUoY29sID0gbXpfcnQsCiAgICAgICAgICAgaW50byA9IGMoIm0veiIsICJydCIpLAogICAgICAgICAgIHNlcCA9ICJfIikgJT4lCiAgcmVuYW1lKCJwLXZhbHVlIiA9ICJwIikgJT4lCiAgcmVuYW1lKCJ0LXNjb3JlIiA9ICJzdGF0aXN0aWMiKQoKd3JpdGVfY3N2KHBhaXJlZF9jdHJsX2Zvcl9tdW1taWNob2csCiAgICAgICAgICAiZm9yIG11bW1pY2hvZyBhbmFseXNpcy90LXRlc3QtcmVzLWN0cmwtcGFpcmVkLmNzdiIpCgpgYGAKCiMjIyMgUGFpcmVkIGJldGEKCmBgYHtyfQojIHJ1biBwYWlyZWQgdC10ZXN0cyBmb3IgY29udHJvbCBpbnRlcnZlbnRpb24KYmV0YV90LnRlc3RfcGFpcmVkIDwtIGRmX2Zvcl9zdGF0cyAlPiUKICBmaWx0ZXIodHJlYXRtZW50ID09ICJiZXRhIikgJT4lCiBkcGx5cjo6c2VsZWN0KHN1YmplY3QsIHBlcmlvZCwgbXpfcnQsIHJlbF9hYnVuZF9sb2cyKSAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgdF90ZXN0KHJlbF9hYnVuZF9sb2cyIH4gcGVyaW9kLCAKICAgICAgICAgcGFpcmVkID0gVFJVRSwgCiAgICAgICAgIHAuYWRqdXN0Lm1ldGhvZCA9ICJCSCIpICU+JSAjIEJlbmphbWluaS1Ib2NoYmVyZyBjb250cm9sbGluZyB0byBsb3dlciBmYWxzZSBwb3NpdGl2ZXMKICBhZGRfc2lnbmlmaWNhbmNlKCkKYGBgCgpTdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZlYXR1cmVzCgpgYGB7cn0KIyB3aGljaCBmZWF0dXJlcyBhcmUgc2lnbmlmaWNhbnQ/CmJldGFfdC50ZXN0X3BhaXJlZF9zaWcgPC0gYmV0YV90LnRlc3RfcGFpcmVkICU+JQogIGZpbHRlcihwIDwgMC4wNSkKa2FibGUoYmV0YV90LnRlc3RfcGFpcmVkX3NpZykKCiMgaG93IG1hbnkgYXJlIHNpZ25pZmljYW50Pwpucm93KGJldGFfdC50ZXN0X3BhaXJlZF9zaWcpCmBgYAoKIyMjIyMgUmVtb3ZlIEJHIGRpZXQKCmBgYHtyfQojIGxldCdzIGdyYWIgYm90aCBkYXRhc2V0cyBmb3IgZmVhdHVyZXMgc2lnIGluIHByZSB2IHBvc3QgYmV0YSBhbmQgcHJlIHYgcG9zdCBjb250cm9sIGFuZCBjb21iaW5lIHRoZW0KZnVsbGpvaW5fdC50ZXN0X2JldGFBTkRjdHJsIDwtIGZ1bGxfam9pbihiZXRhX3QudGVzdF9wYWlyZWRfc2lnLCBjdHJsX3QudGVzdF9wYWlyZWRfc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiLmJldGEiLCAiLmN0cmwiKSkKCiMgbnVtYmVyIG9mIGZlYXR1cmVzIGluIGNvbWJpbmVkIGxpc3QKbnJvdyhmdWxsam9pbl90LnRlc3RfYmV0YUFORGN0cmwpCgpgYGAKCkxldCdzIHRyeSBhbmQgcmVtb3ZlIGZlYXR1cmVzIHNpZ25pZmljYW50IGR1ZSB0byB0aGUgYmFja2dyb3VuZCBkaWV0CgpgYGB7cn0Kc2lnX3BhaXJlZF9iZXRhX3JtQkcgPC0gZnVsbGpvaW5fdC50ZXN0X2JldGFBTkRjdHJsICU+JQogICMgYWRkIGEgY29sdW1uIHRvIGFjY291bnQgZm9yIGRpcmVjdGlvbgogIG11dGF0ZShzaWduID0gc3RhdGlzdGljLmJldGEgKiBzdGF0aXN0aWMuY3RybCkgJT4lCiAgIyByZXBsYWNlIE5BcyBpbiB0aGUgc2lnbiBjb2x1bW4gd2l0aCAwCiAgbXV0YXRlKHNpZ24gPSByZXBsYWNlX25hKHNpZ24sIDApKSAlPiUKICAjIHJlcGxhY2UgTkFzIGluIHRoZSBzdGF0aXN0aWMuY3RybCBjb2x1bW4gdG8gMAogIG11dGF0ZShzdGF0aXN0aWMuY3RybCA9IHJlcGxhY2VfbmEoc3RhdGlzdGljLmN0cmwsIDApKSAlPiUKICAjIGZpbHRlciBmb3IgY29sdW1ucyB0aGF0IGFyZSBlaXRoZXIgbmVnYXRpdmUgKG1lYW5zIGN0cmwgYW5kIHRvbWF0byBhcmUgZ29pbmcgaW4gb3Bwb3NpdGUgZGlyKSBvciB3aGVyZSB0aGUgc3RhdC5jdHJsIGNvbCBpcyAwIChzbyB3ZSBkb24ndCByZW1vdmUgZmVhdHVyZXMgdGhhdCBhcmUganVzdCBub3QgcHJlc2VudCBpbiB0aGUgc2lnIGNvbnRyb2wgbGlzdCkKICBmaWx0ZXIoKHNpZ24gPCAwIHwgc3RhdGlzdGljLmN0cmwgPT0gMCkpCgojIG51bWJlciBvZiBmZWF0dXJlcyB3aXRob3V0IGJnIGRpZXQgZWZmZWN0Cm5yb3coc2lnX3BhaXJlZF9iZXRhX3JtQkcpCmBgYAoKSG93IG1hbnkgQkctZGlldC1yZWxhdGVkIGZlYXR1cmVzIGRpZCB3ZSByZW1vdmUgZnJvbSB0aGUgbGlzdCBvZiBzaWduaWZpY2FudCBiZXRhIGZlYXR1cmVzPwoKYGBge3J9Cm5yb3coYmV0YV90LnRlc3RfcGFpcmVkX3NpZykgLSBucm93KHNpZ19wYWlyZWRfYmV0YV9ybUJHKQpgYGAKCiMjIyMjIEFOT1ZBIG92ZXJsYXAKCktlZXAgc2lnIGZlYXR1cmVzIGluIHQtdGVzdCB0aGF0IGhhdmUgYSBtYXRjaCBpbiBzaWcgQU5PVkEuIExldCdzIHRha2Ugb3VyIG5ldyBmZWF0dXJlIGxpc3QgKGJhY2tncm91bmQgZGlldCBlZmZlY3QgcmVtb3ZlZCkKCmBgYHtyfQojIHNlbGVjdCBvbmx5IGZlYXR1cmVzIGZyb20gcGFpcmVkIGxpc3QgdGhhdCBoYXZlIGEgbWF0Y2ggaW4gQU5PVkEgbGlzdApiZXRhX3NpZ19BTk9WQV9vdmVybGFwX3BhaXJlZCA8LSBpbm5lcl9qb2luKHNpZ19wYWlyZWRfYmV0YV9ybUJHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydF90dWtleUhTRF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi50LXRlc3QiLCAiLnR1a2V5cyIpKQoKIyBmZWF0dXJlcyBvdmVybGFwcGluZyB3aXRoIHNpZyBBTk9WQQp1bmlxdWUoYmV0YV9zaWdfQU5PVkFfb3ZlcmxhcF9wYWlyZWQkbXpfcnQpCmBgYAoKIyMjIyMgTXVtbWljaG9nIGxpc3QKClB1bGxpbmcgZmVhdHVyZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnQgaW4gcGFpcmVkIHQtdGVzdCBkdWUgdG8gdHJlYXRtZW50LCBub3QgZHVlIHRvIGJhY2tncm91bmQgZGlldC4KCmBgYHtyfQpwYWlyZWRfYmV0YV9mb3JfbXVtbWljaG9nIDwtIHNpZ19wYWlyZWRfYmV0YV9ybUJHICU+JQogIGRwbHlyOjpzZWxlY3QobXpfcnQsCiAgICAgICAgIHAuYmV0YSwKICAgICAgICAgc3RhdGlzdGljLmJldGEpICU+JQogIHNlcGFyYXRlKGNvbCA9IG16X3J0LAogICAgICAgICAgIGludG8gPSBjKCJtL3oiLCAicnQiKSwKICAgICAgICAgICBzZXAgPSAiXyIpICU+JQogIHJlbmFtZSgicC12YWx1ZSIgPSAicC5iZXRhIikgJT4lCiAgcmVuYW1lKCJ0LXNjb3JlIiA9ICJzdGF0aXN0aWMuYmV0YSIpCgp3cml0ZV9jc3YocGFpcmVkX2JldGFfZm9yX211bW1pY2hvZywKICAgICAgICAgICJmb3IgbXVtbWljaG9nIGFuYWx5c2lzL3QtdGVzdC1yZXMtYmV0YS1wYWlyZWQuY3N2IikKCmBgYAoKIyMjIyBQYWlyZWQgcmVkCgpgYGB7cn0KIyBydW4gcGFpcmVkIHQtdGVzdHMgZm9yIGNvbnRyb2wgaW50ZXJ2ZW50aW9uCnJlZF90LnRlc3RfcGFpcmVkIDwtIGRmX2Zvcl9zdGF0cyAlPiUKICBmaWx0ZXIodHJlYXRtZW50ID09ICJyZWQiKSAlPiUKIGRwbHlyOjpzZWxlY3Qoc3ViamVjdCwgcGVyaW9kLCBtel9ydCwgcmVsX2FidW5kX2xvZzIpICU+JQogIGdyb3VwX2J5KG16X3J0KSAlPiUKICB0X3Rlc3QocmVsX2FidW5kX2xvZzIgfiBwZXJpb2QsIAogICAgICAgICBwYWlyZWQgPSBUUlVFLCAKICAgICAgICAgcC5hZGp1c3QubWV0aG9kID0gIkJIIikgJT4lICMgQmVuamFtaW5pLUhvY2hiZXJnIGNvbnRyb2xsaW5nIHRvIGxvd2VyIGZhbHNlIHBvc2l0aXZlcwogIGFkZF9zaWduaWZpY2FuY2UoKQpgYGAKClN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZmVhdHVyZXMKCmBgYHtyfQojIHdoaWNoIGZlYXR1cmVzIGFyZSBzaWduaWZpY2FudD8KcmVkX3QudGVzdF9wYWlyZWRfc2lnIDwtIHJlZF90LnRlc3RfcGFpcmVkICU+JQogIGZpbHRlcihwIDwgMC4wNSkKa2FibGUocmVkX3QudGVzdF9wYWlyZWRfc2lnKQoKIyBob3cgbWFueSBhcmUgc2lnbmlmaWNhbnQ/Cm5yb3cocmVkX3QudGVzdF9wYWlyZWRfc2lnKQpgYGAKCiMjIyMjIFJlbW92ZSBCRyBkaWV0CgpgYGB7cn0KIyBsZXQncyBncmFiIGJvdGggZGF0YXNldHMgZm9yIGZlYXR1cmVzIHNpZyBpbiBwcmUgdiBwb3N0IHJlZCBhbmQgcHJlIHYgcG9zdCBjb250cm9sIGFuZCBjb21iaW5lIHRoZW0KZnVsbGpvaW5fdC50ZXN0X3JlZEFORGN0cmwgPC0gZnVsbF9qb2luKHJlZF90LnRlc3RfcGFpcmVkX3NpZywgY3RybF90LnRlc3RfcGFpcmVkX3NpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi5yZWQiLCAiLmN0cmwiKSkKCiMgbnVtYmVyIG9mIGZlYXR1cmVzIGluIGNvbWJpbmVkIGxpc3QKbnJvdyhmdWxsam9pbl90LnRlc3RfcmVkQU5EY3RybCkKCmBgYAoKTGV0J3MgdHJ5IGFuZCByZW1vdmUgZmVhdHVyZXMgc2lnbmlmaWNhbnQgZHVlIHRvIHRoZSBiYWNrZ3JvdW5kIGRpZXQKCmBgYHtyfQpzaWdfcGFpcmVkX3JlZF9ybUJHIDwtIGZ1bGxqb2luX3QudGVzdF9yZWRBTkRjdHJsICU+JQogICMgYWRkIGEgY29sdW1uIHRvIGFjY291bnQgZm9yIGRpcmVjdGlvbgogIG11dGF0ZShzaWduID0gc3RhdGlzdGljLnJlZCAqIHN0YXRpc3RpYy5jdHJsKSAlPiUKICAjIHJlcGxhY2UgTkFzIGluIHRoZSBzaWduIGNvbHVtbiB3aXRoIDAKICBtdXRhdGUoc2lnbiA9IHJlcGxhY2VfbmEoc2lnbiwgMCkpICU+JQogICMgcmVwbGFjZSBOQXMgaW4gdGhlIHN0YXRpc3RpYy5jdHJsIGNvbHVtbiB0byAwCiAgbXV0YXRlKHN0YXRpc3RpYy5jdHJsID0gcmVwbGFjZV9uYShzdGF0aXN0aWMuY3RybCwgMCkpICU+JQogICMgZmlsdGVyIGZvciBjb2x1bW5zIHRoYXQgYXJlIGVpdGhlciBuZWdhdGl2ZSAobWVhbnMgY3RybCBhbmQgdG9tYXRvIGFyZSBnb2luZyBpbiBvcHBvc2l0ZSBkaXIpIG9yIHdoZXJlIHRoZSBzdGF0LmN0cmwgY29sIGlzIDAgKHNvIHdlIGRvbid0IHJlbW92ZSBmZWF0dXJlcyB0aGF0IGFyZSBqdXN0IG5vdCBwcmVzZW50IGluIHRoZSBzaWcgY29udHJvbCBsaXN0KQogIGZpbHRlcigoc2lnbiA8IDAgfCBzdGF0aXN0aWMuY3RybCA9PSAwKSkKCiMgbnVtYmVyIG9mIGZlYXR1cmVzIHdpdGhvdXQgYmcgZGlldCBlZmZlY3QKbnJvdyhzaWdfcGFpcmVkX3JlZF9ybUJHKQpgYGAKCkhvdyBtYW55IEJHLWRpZXQtcmVsYXRlZCBmZWF0dXJlcyBkaWQgd2UgcmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2Ygc2lnbmlmaWNhbnQgYmV0YSBmZWF0dXJlcz8KCmBgYHtyfQpucm93KHJlZF90LnRlc3RfcGFpcmVkX3NpZykgLSBucm93KHNpZ19wYWlyZWRfcmVkX3JtQkcpCmBgYAoKIyMjIyMgQU5PVkEgb3ZlcmxhcAoKS2VlcCBzaWcgZmVhdHVyZXMgaW4gdC10ZXN0IHRoYXQgaGF2ZSBhIG1hdGNoIGluIHNpZyBBTk9WQS4gTGV0J3MgdGFrZSBvdXIgbmV3IGZlYXR1cmUgbGlzdCAoYmFja2dyb3VuZCBkaWV0IGVmZmVjdCByZW1vdmVkKQoKYGBge3J9CiMgc2VsZWN0IG9ubHkgZmVhdHVyZXMgZnJvbSBwYWlyZWQgbGlzdCB0aGF0IGhhdmUgYSBtYXRjaCBpbiBBTk9WQSBsaXN0CnJlZF9zaWdfQU5PVkFfb3ZlcmxhcF9wYWlyZWQgPC0gaW5uZXJfam9pbihzaWdfcGFpcmVkX3JlZF9ybUJHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydF90dWtleUhTRF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi50LXRlc3QiLCAiLnR1a2V5cyIpKQoKIyBmZWF0dXJlcyBvdmVybGFwcGluZyB3aXRoIHNpZyBBTk9WQQp1bmlxdWUocmVkX3NpZ19BTk9WQV9vdmVybGFwX3BhaXJlZCRtel9ydCkKYGBgCgojIyMjIyBNdW1taWNob2cgbGlzdAoKUHVsbGluZyBmZWF0dXJlcyB0aGF0IGFyZSBzaWduaWZpY2FudCBpbiBwYWlyZWQgdC10ZXN0IGR1ZSB0byB0cmVhdG1lbnQsIG5vdCBkdWUgdG8gYmFja2dyb3VuZCBkaWV0LgoKYGBge3J9CnBhaXJlZF9yZWRfZm9yX211bW1pY2hvZyA8LSBzaWdfcGFpcmVkX3JlZF9ybUJHICU+JQogIGRwbHlyOjpzZWxlY3QobXpfcnQsCiAgICAgICAgIHAucmVkLAogICAgICAgICBzdGF0aXN0aWMucmVkKSAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibS96IiwgInJ0IiksCiAgICAgICAgICAgc2VwID0gIl8iKSAlPiUKICByZW5hbWUoInAtdmFsdWUiID0gInAucmVkIikgJT4lCiAgcmVuYW1lKCJ0LXNjb3JlIiA9ICJzdGF0aXN0aWMucmVkIikKCndyaXRlX2NzdihwYWlyZWRfcmVkX2Zvcl9tdW1taWNob2csCiAgICAgICAgICAiZm9yIG11bW1pY2hvZyBhbmFseXNpcy90LXRlc3QtcmVzLXJlZC1wYWlyZWQuY3N2IikKCmBgYAoKIyMjIyBQYWlyZWQgdG9tYXRvCgpgYGB7cn0KIyBydW4gcGFpcmVkIHQtdGVzdHMgZm9yIGNvbnRyb2wgaW50ZXJ2ZW50aW9uCnRvbWF0b190LnRlc3RfcGFpcmVkIDwtIGRmX2Zvcl9zdGF0cyAlPiUKICBmaWx0ZXIodG9tYXRvX29yX2NvbnRyb2wgPT0gInRvbWF0byIpICU+JQogZHBseXI6OnNlbGVjdChzdWJqZWN0LCBwZXJpb2QsIG16X3J0LCByZWxfYWJ1bmRfbG9nMikgJT4lCiAgZ3JvdXBfYnkobXpfcnQpICU+JQogIHRfdGVzdChyZWxfYWJ1bmRfbG9nMiB+IHBlcmlvZCwgCiAgICAgICAgIHBhaXJlZCA9IFRSVUUsIAogICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSAlPiUgIyBCZW5qYW1pbmktSG9jaGJlcmcgY29udHJvbGxpbmcgdG8gbG93ZXIgZmFsc2UgcG9zaXRpdmVzCiAgYWRkX3NpZ25pZmljYW5jZSgpCmBgYAoKU3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmZWF0dXJlcwoKYGBge3J9CiMgd2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50Pwp0b21hdG9fdC50ZXN0X3BhaXJlZF9zaWcgPC0gdG9tYXRvX3QudGVzdF9wYWlyZWQgJT4lCiAgZmlsdGVyKHAgPCAwLjA1KQprYWJsZSh0b21hdG9fdC50ZXN0X3BhaXJlZF9zaWcpCgojIGhvdyBtYW55IGFyZSBzaWduaWZpY2FudD8KbnJvdyh0b21hdG9fdC50ZXN0X3BhaXJlZF9zaWcpCmBgYAoKIyMjIyMgUmVtb3ZlIEJHIGRpZXQKCmBgYHtyfQojIGxldCdzIGdyYWIgYm90aCBkYXRhc2V0cyBmb3IgZmVhdHVyZXMgc2lnIGluIHByZSB2IHBvc3QgcmVkIGFuZCBwcmUgdiBwb3N0IGNvbnRyb2wgYW5kIGNvbWJpbmUgdGhlbQpmdWxsam9pbl90LnRlc3RfdG9tQU5EY3RybCA8LSBmdWxsX2pvaW4odG9tYXRvX3QudGVzdF9wYWlyZWRfc2lnLCBjdHJsX3QudGVzdF9wYWlyZWRfc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gYygiLnRvbSIsICIuY3RybCIpKQoKIyBudW1iZXIgZmVhdHVyZXMgaW4gZnVsbCBsaXN0Cm5yb3coZnVsbGpvaW5fdC50ZXN0X3RvbUFORGN0cmwpCgpgYGAKCkxldCdzIHRyeSBhbmQgcmVtb3ZlIGZlYXR1cmVzIHNpZ25pZmljYW50IGR1ZSB0byB0aGUgYmFja2dyb3VuZCBkaWV0CgpgYGB7cn0Kc2lnX3BhaXJlZF90b21fcm1CRyA8LSBmdWxsam9pbl90LnRlc3RfdG9tQU5EY3RybCAlPiUKICAjIGFkZCBhIGNvbHVtbiB0byBhY2NvdW50IGZvciBkaXJlY3Rpb24KICBtdXRhdGUoc2lnbiA9IHN0YXRpc3RpYy50b20gKiBzdGF0aXN0aWMuY3RybCkgJT4lCiAgIyByZXBsYWNlIE5BcyBpbiB0aGUgc2lnbiBjb2x1bW4gd2l0aCAwCiAgbXV0YXRlKHNpZ24gPSByZXBsYWNlX25hKHNpZ24sIDApKSAlPiUKICAjIHJlcGxhY2UgTkFzIGluIHRoZSBzdGF0aXN0aWMuY3RybCBjb2x1bW4gdG8gMAogIG11dGF0ZShzdGF0aXN0aWMuY3RybCA9IHJlcGxhY2VfbmEoc3RhdGlzdGljLmN0cmwsIDApKSAlPiUKICAjIGZpbHRlciBmb3IgY29sdW1ucyB0aGF0IGFyZSBlaXRoZXIgbmVnYXRpdmUgKG1lYW5zIGN0cmwgYW5kIHRvbWF0byBhcmUgZ29pbmcgaW4gb3Bwb3NpdGUgZGlyKSBvciB3aGVyZSB0aGUgc3RhdC5jdHJsIGNvbCBpcyAwIChzbyB3ZSBkb24ndCByZW1vdmUgZmVhdHVyZXMgdGhhdCBhcmUganVzdCBub3QgcHJlc2VudCBpbiB0aGUgc2lnIGNvbnRyb2wgbGlzdCkKICBmaWx0ZXIoKHNpZ24gPCAwIHwgc3RhdGlzdGljLmN0cmwgPT0gMCkpCgojIG51bWJlciBvZiBmZWF0dXJlcyBpbiBuZXcgbGlzdCB3aXRob3V0IGJnIGRpZXQgZWZmZWN0Cm5yb3coc2lnX3BhaXJlZF90b21fcm1CRykKYGBgCgpIb3cgbWFueSBCRy1kaWV0LXJlbGF0ZWQgZmVhdHVyZXMgZGlkIHdlIHJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIHNpZ25pZmljYW50IGJldGEgZmVhdHVyZXM/CgpgYGB7cn0KbnJvdyh0b21hdG9fdC50ZXN0X3BhaXJlZF9zaWcpIC0gbnJvdyhzaWdfcGFpcmVkX3RvbV9ybUJHKQpgYGAKCiMjIyMjIEFOT1ZBIG92ZXJsYXAKCktlZXAgc2lnIGZlYXR1cmVzIGluIHQtdGVzdCB0aGF0IGhhdmUgYSBtYXRjaCBpbiBzaWcgQU5PVkEuIExldCdzIHRha2Ugb3VyIG5ldyBmZWF0dXJlIGxpc3QgKGJhY2tncm91bmQgZGlldCBlZmZlY3QgcmVtb3ZlZCkKCmBgYHtyfQojIHNlbGVjdCBvbmx5IGZlYXR1cmVzIGZyb20gcGFpcmVkIGxpc3QgdGhhdCBoYXZlIGEgbWF0Y2ggaW4gQU5PVkEgbGlzdAp0b21fc2lnX0FOT1ZBX292ZXJsYXBfcGFpcmVkIDwtIGlubmVyX2pvaW4oc2lnX3BhaXJlZF90b21fcm1CRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnRfdHVrZXlIU0Rfc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCIudC10ZXN0IiwgIi50dWtleXMiKSkKCiMgZmVhdHVyZXMgb3ZlcmxhcHBpbmcgd2l0aCBzaWcgQU5PVkEKdW5pcXVlKHRvbV9zaWdfQU5PVkFfb3ZlcmxhcF9wYWlyZWQkbXpfcnQpCmBgYAoKIyMjIyMgTXVtbWljaG9nIGxpc3QKCmBgYHtyfQpwYWlyZWRfdG9tYXRvX2Zvcl9tdW1taWNob2cgPC0gdG9tYXRvX3QudGVzdF9wYWlyZWQgJT4lCiAgZHBseXI6OnNlbGVjdChtel9ydCwKICAgICAgICAgcCwKICAgICAgICAgc3RhdGlzdGljKSAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibS96IiwgInJ0IiksCiAgICAgICAgICAgc2VwID0gIl8iKSAlPiUKICByZW5hbWUoInAtdmFsdWUiID0gInAiKSAlPiUKICByZW5hbWUoInQtc2NvcmUiID0gInN0YXRpc3RpYyIpCgp3cml0ZV9jc3YocGFpcmVkX3JlZF9mb3JfbXVtbWljaG9nLAogICAgICAgICAgImZvciBtdW1taWNob2cgYW5hbHlzaXMvdC10ZXN0LXJlcy10b21hdG8tcGFpcmVkLmNzdiIpCgpgYGAKCkhlcmUsIEkgd2lsbCBjb21wYXJlIGNvbnRyb2wgdG8gZWFjaCB0b21hdG8gdHJlYXRtZW50IGluZGl2aWR1YWxseSwgYW5kIHRoZW4gdG9tYXRvIHRyZWF0bWVudHMgYWdhaW5zdCBlYWNoIG90aGVyLiBJIHdpbGwgYWxzbyBjb21wYXJlIHRvbWF0byB0byBjb250cm9sLiBJIGFtIHVzaW5nIHRoZSBsb2cgdHJhbnNmb3JtZWQgdmFsdWVzIG9mIHJlbCBhYnVuZGFuY2Ugc2luY2UgcGFyYW1ldHJpYyB0ZXN0cyBhc3N1bWUgbm9ybWFsaXR5LgoKIyMjIyBSZWQgdiBjdHJsCgpgYGB7ciwgcmVkIHYgY3RybH0KIyBydW4gdC10ZXN0CnJlZF92X2N0cmxfdC50ZXN0IDwtIGRmX2Zvcl9zdGF0cyAlPiUKICBmaWx0ZXIodHJlYXRtZW50ICVpbiUgYygiY29udHJvbCIsICJyZWQiKSkgJT4lCiAgZmlsdGVyKHBlcmlvZCA9PSAiYjMiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHN1YmplY3QsIHRyZWF0bWVudCwgbXpfcnQsIHJlbF9hYnVuZF9sb2cyKSAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgdF90ZXN0KHJlbF9hYnVuZF9sb2cyIH4gdHJlYXRtZW50LCAKICAgICAgICAgcGFpcmVkID0gRkFMU0UsIAogICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSAlPiUgIyBCZW5qYW1pbmktSG9jaGJlcmcgY29udHJvbGxpbmcgdG8gbG93ZXIgZmFsc2UgcG9zaXRpdmVzCiAgYWRkX3NpZ25pZmljYW5jZSgpCmBgYAoKU3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmZWF0dXJlcwoKYGBge3J9CiMgd2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50PwpzaWdfcmVkX3ZfY3RybF90LnRlc3QgPC0gcmVkX3ZfY3RybF90LnRlc3QgJT4lCiAgZmlsdGVyKHAgPCAwLjA1KQprYWJsZShzaWdfcmVkX3ZfY3RybF90LnRlc3QpCgojIGhvdyBtYW55IGFyZSBzaWduaWZpY2FudD8KbnJvdyhzaWdfcmVkX3ZfY3RybF90LnRlc3QpCmBgYAoKIyMjIyMgQU5PVkEgb3ZlcmxhcAoKS2VlcCBzaWcgZmVhdHVyZXMgaW4gdW5wYWlyZWQgdC10ZXN0IHRoYXQgaGF2ZSBhIG1hdGNoIGluIHNpZyBBTk9WQQoKYGBge3J9CnNpZ19vdmVybGFwX2N0cmxfcmVkIDwtIGlubmVyX2pvaW4oc2lnX3JlZF92X2N0cmxfdC50ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydF90dWtleUhTRF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi50LXRlc3QiLCAiLnR1a2V5cyIpKQoKdW5pcXVlKHNpZ19vdmVybGFwX2N0cmxfcmVkJG16X3J0KQpgYGAKCiMjIyMjIE11bW1pY2hvZyBsaXN0CgpgYGB7cn0KY3RybF92X3JlZF9mb3JfbXVtbWljaG9nIDwtIHJlZF92X2N0cmxfdC50ZXN0ICU+JQogIGRwbHlyOjpzZWxlY3QobXpfcnQsCiAgICAgICAgIHAsCiAgICAgICAgIHN0YXRpc3RpYykgJT4lCiAgc2VwYXJhdGUoY29sID0gbXpfcnQsCiAgICAgICAgICAgaW50byA9IGMoIm0veiIsICJydCIpLAogICAgICAgICAgIHNlcCA9ICJfIikgJT4lCiAgcmVuYW1lKCJwLXZhbHVlIiA9ICJwIikgJT4lCiAgcmVuYW1lKCJ0LXNjb3JlIiA9ICJzdGF0aXN0aWMiKQoKd3JpdGVfY3N2KGN0cmxfdl9yZWRfZm9yX211bW1pY2hvZywKICAgICAgICAgICJmb3IgbXVtbWljaG9nIGFuYWx5c2lzL3QtdGVzdC1yZXMtY3RybC12LXJlZC5jc3YiKQoKYGBgCgojIyMjIEJldGEgdiBjdHJsCgpgYGB7ciwgYmV0YSB2IGN0cmwgdC10ZXN0IHdpdGggb3V0bGllcn0KIyBydW4gdC10ZXN0cwpiZXRhX3ZfY3RybF90LnRlc3QgPC0gZGZfZm9yX3N0YXRzICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJjb250cm9sIiAsICJiZXRhIiksCiAgICAgICAgIHBlcmlvZCA9PSAiYjMiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHN1YmplY3QsIHRyZWF0bWVudCwgbXpfcnQsIHJlbF9hYnVuZF9sb2cyKSAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgdF90ZXN0KHJlbF9hYnVuZF9sb2cyIH4gdHJlYXRtZW50LCAKICAgICAgICAgcGFpcmVkID0gRkFMU0UsIAogICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSAlPiUgIyBCZW5qYW1pbmktSG9jaGJlcmcgY29udHJvbGxpbmcgdG8gbG93ZXIgZmFsc2UgcG9zaXRpdmVzCiAgYWRkX3NpZ25pZmljYW5jZSgpCmBgYAoKU3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmZWF0dXJlcwoKYGBge3J9CiMgd2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50PwpzaWdfYmV0YV92X2N0cmxfdC50ZXN0IDwtIGJldGFfdl9jdHJsX3QudGVzdCAlPiUKICBmaWx0ZXIocCA8IDAuMDUpCmthYmxlKHNpZ19iZXRhX3ZfY3RybF90LnRlc3QpCgojIGhvdyBtYW55IGFyZSBzaWduaWZpY2FudD8KbnJvdyhzaWdfYmV0YV92X2N0cmxfdC50ZXN0KQpgYGAKCiMjIyMjIEFOT1ZBIG92ZXJsYXAKCktlZXAgc2lnIGZlYXR1cmVzIGluIHQtdGVzdCB0aGF0IGhhdmUgYSBtYXRjaCBpbiBzaWcgQU5PVkEKCmBgYHtyfQpzaWdfb3ZlcmxhcF9jdHJsX2JldGEgPC0gaW5uZXJfam9pbihzaWdfYmV0YV92X2N0cmxfdC50ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydF90dWtleUhTRF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi50LXRlc3QiLCAiLnR1a2V5cyIpKQoKIyB3aGljaCBmZWF0dXJlcyBvdmVybGFwPwp1bmlxdWUoc2lnX292ZXJsYXBfY3RybF9iZXRhJG16X3J0KQpgYGAKCiMjIyMjIE11bW1pY2hvZyBsaXN0CgpgYGB7cn0KY3RybF92X2JldGFfZm9yX211bW1pY2hvZyA8LSBiZXRhX3ZfY3RybF90LnRlc3QgJT4lCiAgZHBseXI6OnNlbGVjdChtel9ydCwKICAgICAgICAgcCwKICAgICAgICAgc3RhdGlzdGljKSAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibS96IiwgInJ0IiksCiAgICAgICAgICAgc2VwID0gIl8iKSAlPiUKICByZW5hbWUoInAtdmFsdWUiID0gInAiKSAlPiUKICByZW5hbWUoInQtc2NvcmUiID0gInN0YXRpc3RpYyIpCgp3cml0ZV9jc3YoY3RybF92X2JldGFfZm9yX211bW1pY2hvZywKICAgICAgICAgICJmb3IgbXVtbWljaG9nIGFuYWx5c2lzL3QtdGVzdC1yZXMtY3RybC12LWJldGEuY3N2IikKCmBgYAoKIyMjIyBCZXRhIHYgcmVkCgpgYGB7ciwgYmV0YSB2IHJlZCB0IHRlc3R9CiMgcnVuIHQtdGVzdHMKYmV0YV92X3JlZF90LnRlc3QgPC0gZGZfZm9yX3N0YXRzICU+JQogIGZpbHRlcih0cmVhdG1lbnQgJWluJSBjKCJiZXRhIiwgInJlZCIpLAogICAgICAgICBwZXJpb2QgPT0gImIzIikgJT4lCiAgZHBseXI6OnNlbGVjdChzdWJqZWN0LCB0cmVhdG1lbnQsIG16X3J0LCByZWxfYWJ1bmRfbG9nMikgJT4lCiAgZ3JvdXBfYnkobXpfcnQpICU+JQogIHRfdGVzdChyZWxfYWJ1bmRfbG9nMiB+IHRyZWF0bWVudCwgCiAgICAgICAgIHBhaXJlZCA9IEZBTFNFLCAKICAgICAgICAgcC5hZGp1c3QubWV0aG9kID0gIkJIIikgJT4lICMgQmVuamFtaW5pLUhvY2hiZXJnIGNvbnRyb2xsaW5nIHRvIGxvd2VyIGZhbHNlIHBvc2l0aXZlcwogIGFkZF9zaWduaWZpY2FuY2UoKQpgYGAKClN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZmVhdHVyZXMKCmBgYHtyfQojIHdoaWNoIGZlYXR1cmVzIGFyZSBzaWduaWZpY2FudD8Kc2lnX2JldGFfdl9yZWRfdC50ZXN0IDwtIGJldGFfdl9yZWRfdC50ZXN0ICU+JQogIGZpbHRlcihwIDwgMC4wNSkKa2FibGUoc2lnX2JldGFfdl9yZWRfdC50ZXN0KQoKIyBob3cgbWFueSBhcmUgc2lnbmlmaWNhbnQ/Cm5yb3coc2lnX2JldGFfdl9yZWRfdC50ZXN0KQpgYGAKCiMjIyMjIEFOT1ZBIG92ZXJsYXAKCktlZXAgc2lnIGZlYXR1cmVzIGluIHQtdGVzdCB0aGF0IGhhdmUgYSBtYXRjaCBpbiBzaWcgQU5PVkEKCmBgYHtyfQpzaWdfb3ZlcmxhcF9iZXRhX3JlZCA8LSBpbm5lcl9qb2luKHNpZ19iZXRhX3ZfcmVkX3QudGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnRfdHVrZXlIU0Rfc2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBjKCIudC10ZXN0IiwgIi50dWtleXMiKSkKCiMgd2hpY2ggZmVhdHVyZXMgb3ZlcmxhcD8KdW5pcXVlKHNpZ19vdmVybGFwX2JldGFfcmVkJG16X3J0KQpgYGAKCiMjIyMjIE11bW1pY2hvZyBsaXN0CgpgYGB7cn0KYmV0YV92X3JlZF9mb3JfbXVtbWljaG9nIDwtIGJldGFfdl9yZWRfdC50ZXN0ICU+JQogIGRwbHlyOjpzZWxlY3QobXpfcnQsCiAgICAgICAgIHAsCiAgICAgICAgIHN0YXRpc3RpYykgJT4lCiAgc2VwYXJhdGUoY29sID0gbXpfcnQsCiAgICAgICAgICAgaW50byA9IGMoIm0veiIsICJydCIpLAogICAgICAgICAgIHNlcCA9ICJfIikgJT4lCiAgcmVuYW1lKCJwLXZhbHVlIiA9ICJwIikgJT4lCiAgcmVuYW1lKCJ0LXNjb3JlIiA9ICJzdGF0aXN0aWMiKQoKd3JpdGVfY3N2KGJldGFfdl9yZWRfZm9yX211bW1pY2hvZywKICAgICAgICAgICJmb3IgbXVtbWljaG9nIGFuYWx5c2lzL3QtdGVzdC1yZXMtYmV0YS12LXJlZC5jc3YiKQoKYGBgCgojIyMjIFRvbWF0byB2IGN0cmwKCmBgYHtyLCB0b21hdG8gdiBjb250cm9sIHQtdGVzdH0KIyBydW4gdC10ZXN0cwp0b21fdl9jdHJsX3QudGVzdCA8LSBkZl9mb3Jfc3RhdHMgJT4lCiAgZmlsdGVyKHRvbWF0b19vcl9jb250cm9sICVpbiUgYygiY29udHJvbCIsICJ0b21hdG8iKSwKICAgICAgICAgcGVyaW9kID09ICJiMyIpICU+JQogIGRwbHlyOjpzZWxlY3Qoc3ViamVjdCwgdG9tYXRvX29yX2NvbnRyb2wsIG16X3J0LCByZWxfYWJ1bmRfbG9nMikgJT4lCiAgZ3JvdXBfYnkobXpfcnQpICU+JQogIHRfdGVzdChyZWxfYWJ1bmRfbG9nMiB+IHRvbWF0b19vcl9jb250cm9sLCAKICAgICAgICAgcGFpcmVkID0gRkFMU0UsIAogICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSAlPiUgIyBCZW5qYW1pbmktSG9jaGJlcmcgY29udHJvbGxpbmcgdG8gbG93ZXIgZmFsc2UgcG9zaXRpdmVzCiAgYWRkX3NpZ25pZmljYW5jZSgpCmBgYAoKU3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmZWF0dXJlcwoKYGBge3J9CiMgd2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50PwpzaWdfdG9tX3ZfY3RybF90LnRlc3QgPC0gdG9tX3ZfY3RybF90LnRlc3QgJT4lCiAgZmlsdGVyKHAgPCAwLjA1KQprYWJsZShzaWdfdG9tX3ZfY3RybF90LnRlc3QpCgojIGhvdyBtYW55IGFyZSBzaWduaWZpY2FudD8KbnJvdyhzaWdfdG9tX3ZfY3RybF90LnRlc3QpCmBgYAoKIyMjIyMgQU5PVkEgb3ZlcmxhcAoKS2VlcCBzaWcgZmVhdHVyZXMgaW4gdC10ZXN0IHRoYXQgaGF2ZSBhIG1hdGNoIGluIHNpZyBBTk9WQQoKYGBge3J9CnNpZ19vdmVybGFwX3RvbV9jdHJsIDwtIGlubmVyX2pvaW4oc2lnX3RvbV92X2N0cmxfdC50ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydF90dWtleUhTRF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAibXpfcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGMoIi50LXRlc3QiLCAiLnR1a2V5cyIpKQoKIyB3aGljaCBmZWF0dXJlcyBvdmVybGFwPwp1bmlxdWUoc2lnX292ZXJsYXBfdG9tX2N0cmwkbXpfcnQpCmBgYAoKIyMjIyMgTXVtbWljaG9nIGxpc3QKCmBgYHtyfQp0b21fdl9jdHJsX2Zvcl9tdW1taWNob2cgPC0gdG9tX3ZfY3RybF90LnRlc3QgJT4lCiAgZHBseXI6OnNlbGVjdChtel9ydCwKICAgICAgICAgcCwKICAgICAgICAgc3RhdGlzdGljKSAlPiUKICBzZXBhcmF0ZShjb2wgPSBtel9ydCwKICAgICAgICAgICBpbnRvID0gYygibS96IiwgInJ0IiksCiAgICAgICAgICAgc2VwID0gIl8iKSAlPiUKICByZW5hbWUoInAtdmFsdWUiID0gInAiKSAlPiUKICByZW5hbWUoInQtc2NvcmUiID0gInN0YXRpc3RpYyIpCgp3cml0ZV9jc3YodG9tX3ZfY3RybF9mb3JfbXVtbWljaG9nLAogICAgICAgICAgImZvciBtdW1taWNob2cgYW5hbHlzaXMvdC10ZXN0LXJlcy1jdHJsLXYtdG9tYXRvLmNzdiIpCgpgYGAKCiMjIyBIZWF0bWFwcwoKIyMjIyBBTk9WQQoKYGBge3J9CiMgZ28gYmFjayB0byB3aWRlIGZvciBzdGF0cyBkZgpkZl9mb3Jfc3RhdHNfd2lkZSA8LSBkZl9mb3Jfc3RhdHMgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG16X3J0LAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gcmVsX2FidW5kX2xvZzIpCgpBTk9WQV90cnRwZXJpb2RfaGVhdG1hcF9kYXRhIDwtIGRmX2Zvcl9zdGF0c193aWRlICU+JQogIGZpbHRlcihwZXJpb2QgPT0gImIzIikgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGUsIAogICAgICAgICAgICAgICAgYWxsX29mKHRydF9hbm92YV9zaWckbXpfcnQpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInNhbXBsZSIpCgpoZWFkKEFOT1ZBX3RydHBlcmlvZF9oZWF0bWFwX2RhdGEsIG49MykKICAKYGBgCgpgYGB7cn0KIyBwdWxsIG1ldGFkYXRhCm1ldGFkYXRhX0hlYXRtYXAgPC0gbWV0YWRhdGEKCiMgY2hhbmdlIHRyZWF0bWVudCB0byBmYWN0b3IKbWV0YWRhdGFfSGVhdG1hcCR0cmVhdG1lbnQgPC0gYXMuZmFjdG9yKG1ldGFkYXRhX0hlYXRtYXAkdHJlYXRtZW50KQoKIyBtYWtlIGl0IHNvIHRoYXQgcm93bmFtZXMgaW4gbWV0YWRhdGEgbWF0Y2ggcm93bmFtZXMgZnJvbSBoZWF0bWFwIGRmCnJvd25hbWVzKG1ldGFkYXRhX0hlYXRtYXApIDwtIHJvd25hbWVzKEFOT1ZBX3RydHBlcmlvZF9oZWF0bWFwX2RhdGEpCgojIGNyZWF0ZSBhbm5vdGF0aW9uIHJvd3MgZm9yIHRyZWF0bWVudCBhbmQgd3JhbmdsZQojIHNlbGVjdCByb3duYW1lcyAoc2FtcGxlcykgZnJvbSBoZWF0bWFwIG1ldGFkYXRhIChhbHNvIGVuc3VyZXMgdGhlIG9yZGVyIGlzIGNvcnJlY3QpCmFubm9fdHJ0X3JvdyA8LSBhcy5kYXRhLmZyYW1lKHJvd25hbWVzKG1ldGFkYXRhX0hlYXRtYXApKQoKIyBwdWxsIHRydCBjb2x1bW4KYW5ub190cnRfcm93JHRyZWF0bWVudCA8LSBtZXRhZGF0YV9IZWF0bWFwJHRyZWF0bWVudAphbm5vX3RydF9yb3ckc2V4IDwtIG1ldGFkYXRhX0hlYXRtYXAkc2V4CgojIHNlbGVjdCB0cnQKYW5ub190cnRfcm93IDwtIGFubm9fdHJ0X3JvdyAlPiUKICBkcGx5cjo6c2VsZWN0KHRyZWF0bWVudCwgc2V4KQoKIyBnZXQgcm93bmFtZXMgdG8gbWF0Y2ggaGVhdG1hcCBhZ2Fpbgpyb3duYW1lcyhhbm5vX3RydF9yb3cpIDwtIHJvd25hbWVzKG1ldGFkYXRhX0hlYXRtYXApCmBgYAoKYGBge3J9CiMgY3JlYXRlIGFubm90YXRpb24gY29sb3JzCmFubm90YXRpb25fY29sb3JzIDwtIGxpc3QodHJlYXRtZW50ID0gYygiYmV0YSIgPSAib3JhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkIiA9ICJ0b21hdG8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXggPSBjKCJNIiA9ICJidXJseXdvb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiID0gInBpbmsiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEwfQpwaGVhdG1hcCh0KEFOT1ZBX3RydHBlcmlvZF9oZWF0bWFwX2RhdGEpLAogICAgICAgICAgIHNjYWxlID0gInJvdyIsCiAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm9fdHJ0X3JvdywKICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3JzLAogICAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSA4LAogICAgICAgICAgIGN1dHJlZV9jb2xzID0gMywKICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQyIiwKICAgICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygiIzY3YTljZiIsICIjZjdmN2Y3IiwgIiNlZjhhNjIiKSkoMTYpLAogICAgICAgICAgIG1haW4gPSAiSGVhdG1hcCBvZiBmZWF0dXJlcyBzaWduaWZpY2FudCBpbiBBTk9WQSBhY3Jvc3MgYWxsIHRyZWF0bWVudCBncm91cHMgXG5ieSBCZW5qYW1vbmktSG9jaGJlcmcgY29ycmVjdGVkIFxucC12YWx1ZXMgPiAwLjA1IFxuTGlwaWRvbWljcyBDMTggKC0pIFxuU2hvd2luZyBvbmx5IHBvc3QtaW50ZXJ2ZW50aW9uIHRpbWVwb2ludHMiKSAKCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMH0KIyBXaXRob3V0IGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIG9mIHNhbXBsZXMgKGNvbHMpCnBoZWF0bWFwKHQoQU5PVkFfdHJ0cGVyaW9kX2hlYXRtYXBfZGF0YSksCiAgICAgICAgICAgc2NhbGUgPSAicm93IiwKICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub190cnRfcm93LAogICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvcnMsCiAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsCiAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSA4LAogICAgICAgICAgIGN1dHJlZV9jb2xzID0gMywKICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQyIiwKICAgICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygiIzY3YTljZiIsICIjZjdmN2Y3IiwgIiNlZjhhNjIiKSkoMTYpLAogICAgICAgICAgIG1haW4gPSAiSGVhdG1hcCBvZiBmZWF0dXJlcyBzaWduaWZpY2FudCBpbiBBTk9WQSBhY3Jvc3MgdHJlYXRtZW50IGdyb3VwcyBcbmJ5IEJlbmphbW9uaS1Ib2NoYmVyZyBjb3JyZWN0ZWQgXG5wLXZhbHVlcyA+IDAuMDUgXG5MaXBpZG9taWNzIEMxOCAoLSkgXG5TaG93aW5nIG9ubHkgcG9zdC1pbnRlcnZlbnRpb24gdGltZXBvaW50cyIpIAoKYGBgCgojIyMjIFVucGFpcmVkCgpgYGB7cn0KCnVucGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhIDwtIGRmX2Zvcl9zdGF0c193aWRlICU+JQogIGZpbHRlcihwZXJpb2QgPT0gImIzIikgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGUsIAogICAgICAgICAgICAgICAgYWxsX29mKHNpZ19vdmVybGFwX2N0cmxfYmV0YSRtel9ydCksCiAgICAgICAgICAgICAgICBhbGxfb2Yoc2lnX292ZXJsYXBfY3RybF9yZWQkbXpfcnQpLAogICAgICAgICAgICAgICAgYWxsX29mKHNpZ19vdmVybGFwX3RvbV9jdHJsJG16X3J0KSwKICAgICAgICAgICAgICAgIGFsbF9vZihzaWdfb3ZlcmxhcF9iZXRhX3JlZCRtel9ydCkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic2FtcGxlIikKCmhlYWQodW5wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEsbiA9IDMpCiAgCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD0xNX0KcGhlYXRtYXAodCh1bnBhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSksCiAgICAgICAgICAgc2NhbGUgPSAicm93IiwKICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub190cnRfcm93LAogICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvcnMsCiAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSwKICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gVFJVRSwKICAgICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3MgPSAiZXVjbGlkZWFuIiwKICAgICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX2NvbHMgPSAiZXVjbGlkZWFuIiwKICAgICAgICAgY3V0cmVlX3Jvd3MgPSA4LAogICAgICAgICBjdXRyZWVfY29scyA9IDMsCiAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2QgPSAid2FyZC5EMiIsCiAgICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGMoIiM2N2E5Y2YiLCAiI2Y3ZjdmNyIsICIjZWY4YTYyIikpKDE2KSwKICAgICAgICAgICBtYWluID0gIkhlYXRtYXAgb2YgZmVhdHVyZXMgc2lnbmlmaWNhbnQgaW4gYWxsIHVucGFpcmVkIHQtdGVzdCBjb21wYXJpc29ucyB0aGF0IG92ZXJsYXAgd2l0aCBzaWcgQU5PVkEgZmVhdHVyZXMgYWNyb3NzIGFsbCB0cmVhdG1lbnQgZ3JvdXBzIFxuYnkgQmVuamFtb25pLUhvY2hiZXJnIGNvcnJlY3RlZCBcbnAtdmFsdWVzID4gMC4wNSBcbkxpcGlkb21pY3MgQzE4ICgtKSIpCgpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MTV9CiMgd2l0aG91dCBjbHVzdGVyaW5nIG9mIGNvbHMKcGhlYXRtYXAodCh1bnBhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSksCiAgICAgICAgICAgc2NhbGUgPSAicm93IiwKICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub190cnRfcm93LAogICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvcnMsCiAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsCiAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgIGN1dHJlZV9yb3dzID0gOCwKICAgICAgICAgY3V0cmVlX2NvbHMgPSAzLAogICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kID0gIndhcmQuRDIiLAogICAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCIjNjdhOWNmIiwgIiNmN2Y3ZjciLCAiI2VmOGE2MiIpKSgxNiksCiAgICAgICAgICAgbWFpbiA9ICJIZWF0bWFwIG9mIGZlYXR1cmVzIHNpZ25pZmljYW50IGluIGFsbCB1bnBhaXJlZCB0LXRlc3QgY29tcGFyaXNvbnMgdGhhdCBvdmVybGFwIHdpdGggc2lnIEFOT1ZBIGZlYXR1cmVzIGFjcm9zcyBhbGwgdHJlYXRtZW50IGdyb3VwcyBcbmJ5IEJlbmphbW9uaS1Ib2NoYmVyZyBjb3JyZWN0ZWQgXG5wLXZhbHVlcyA+IDAuMDUgXG5MaXBpZG9taWNzIEMxOCAoLSkiKQoKYGBgCgojIyMjIFBhaXJlZAoKIyMjIyMgUmVkCgpgYGB7cn0KcmVkX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSA8LSBkZl9mb3Jfc3RhdHNfd2lkZSAlPiUKICBmaWx0ZXIodHJlYXRtZW50ID09ICJyZWQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZSwgcGVyaW9kLCB0cmVhdG1lbnQsIHNleCwKICAgICAgICAgICAgICAgIGFsbF9vZihyZWRfc2lnX0FOT1ZBX292ZXJsYXBfcGFpcmVkJG16X3J0KSkgJT4lCiAgbXV0YXRlX2F0KCJwZXJpb2QiLCBhcy5mYWN0b3IpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic2FtcGxlIikKYGBgCgpgYGB7cn0KIyBjcmVhdGUgYW5ub3RhdGlvbiByb3dzIGZvciBwcmUvcG9zdCBpbnRlcnZlbnRpb25zIGFuZCB3cmFuZ2xlCiMgc2VsZWN0IHJvd25hbWVzIChzYW1wbGVzKSBmcm9tIGhlYXRtYXAgbWV0YWRhdGEgKGFsc28gZW5zdXJlcyB0aGUgb3JkZXIgaXMgY29ycmVjdCkKYW5ub19yZWRfcm93X3BhaXJlZCA8LSBhcy5kYXRhLmZyYW1lKHJvd25hbWVzKHJlZF9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEpKQoKCiMgcHVsbCBwZXJpb2QgaW50byBhIGNvbHVtbgphbm5vX3JlZF9yb3dfcGFpcmVkJHBlcmlvZCA8LSByZWRfcGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhJHBlcmlvZAphbm5vX3JlZF9yb3dfcGFpcmVkJHNleCA8LSByZWRfcGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhJHNleAoKIyBzZWxlY3QgY29scwphbm5vX3JlZF9yb3dfcGFpcmVkIDwtIGFubm9fcmVkX3Jvd19wYWlyZWQgJT4lCiAgZHBseXI6OnNlbGVjdChwZXJpb2QsIHNleCkKCiMgZ2V0IHJvd25hbWVzIHRvIG1hdGNoIGhlYXRtYXAgYWdhaW4Kcm93bmFtZXMoYW5ub19yZWRfcm93X3BhaXJlZCkgPC0gcm93bmFtZXMocmVkX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSkKYGBgCgpgYGB7cn0KIyBjcmVhdGUgYW5ub3RhdGlvbiBjb2xvcnMKcmVkX2Fubm90YXRpb25fY29sb3JzIDwtIGxpc3QocGVyaW9kID0gYygiYjEiID0gImRhcmtzYWxtb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImIzIiA9ICJyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4ID0gYygiTSIgPSAiYXF1YW1hcmluZTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiA9ICJwaW5rIikpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpwaGVhdG1hcCh0KHJlZF9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGFbLC1jKDE6MyldKSwKICAgICAgICAgICBzY2FsZSA9ICJyb3ciLAogICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vX3JlZF9yb3dfcGFpcmVkLAogICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gcmVkX2Fubm90YXRpb25fY29sb3JzLAogICAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgICAgc2hvd19yb3duYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSA4LAogICAgICAgICBjdXRyZWVfY29scyA9IDIsCiAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2QgPSAid2FyZC5EMiIsCiAgICAgICAgICAgY29sb3IgPSBjb2xvclJhbXBQYWxldHRlKGMoIiM2N2E5Y2YiLCAiI2Y3ZjdmNyIsICIjZWY4YTYyIikpKDE2KSwKICAgICAgICAgICBtYWluID0gIkhlYXRtYXAgb2Ygc2lnbmlmaWNhbnQgZmVhdHVyZXMgcHJlLSB2cy4gcG9zdC1IaWdoLUx5YyBwYWlyZWQgdC10ZXN0IFxuc2lnIGluIEFOT1ZBIGFjcm9zcyBhbGwgdHJlYXRtZW50IGdyb3VwcyBcbmJ5IEJlbmphbW9uaS1Ib2NoYmVyZyBjb3JyZWN0ZWQgcC12YWx1ZXMgPiAwLjA1IFxuQmFja2dyb3VuZCBkaWV0IGVmZmVjdCByZW1vdmVkIFxuTGlwaWRvbWljcyBDMTggKC0pIikKICAKYGBgCgojIyMjIyBCZXRhCgpgYGB7cn0KYmV0YV9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEgPC0gZGZfZm9yX3N0YXRzX3dpZGUgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCA9PSAiYmV0YSIpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlLCBwZXJpb2QsIHRyZWF0bWVudCwgc2V4LAogICAgICAgICAgICAgICAgYWxsX29mKGJldGFfc2lnX0FOT1ZBX292ZXJsYXBfcGFpcmVkJG16X3J0KSkgJT4lCiAgbXV0YXRlX2F0KCJwZXJpb2QiLCBhcy5mYWN0b3IpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic2FtcGxlIikKYGBgCgpgYGB7cn0KIyBjcmVhdGUgYW5ub3RhdGlvbiByb3dzIGZvciBwcmUvcG9zdCBpbnRlcnZlbnRpb25zIGFuZCB3cmFuZ2xlCiMgc2VsZWN0IHJvd25hbWVzIChzYW1wbGVzKSBmcm9tIGhlYXRtYXAgbWV0YWRhdGEgKGFsc28gZW5zdXJlcyB0aGUgb3JkZXIgaXMgY29ycmVjdCkKYW5ub19iZXRhX3Jvd19wYWlyZWQgPC0gYXMuZGF0YS5mcmFtZShyb3duYW1lcyhiZXRhX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSkpCgoKIyBwdWxsIHBlcmlvZCBpbnRvIGEgY29sdW1uCmFubm9fYmV0YV9yb3dfcGFpcmVkJHBlcmlvZCA8LSBiZXRhX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSRwZXJpb2QKYW5ub19iZXRhX3Jvd19wYWlyZWQkc2V4IDwtIGJldGFfcGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhJHNleAoKIyBzZWxlY3QgY29scwphbm5vX2JldGFfcm93X3BhaXJlZCA8LSBhbm5vX2JldGFfcm93X3BhaXJlZCAlPiUKICBkcGx5cjo6c2VsZWN0KHNleCwgcGVyaW9kKQoKIyBnZXQgcm93bmFtZXMgdG8gbWF0Y2ggaGVhdG1hcCBhZ2Fpbgpyb3duYW1lcyhhbm5vX2JldGFfcm93X3BhaXJlZCkgPC0gcm93bmFtZXMoYmV0YV9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEpCmBgYAoKYGBge3J9CiMgY3JlYXRlIGFubm90YXRpb24gY29sb3JzCmJldGFfYW5ub3RhdGlvbl9jb2xvcnMgPC0gbGlzdChwZXJpb2QgPSBjKCJiMSIgPSAiYmlzcXVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiMyIgPSAiZGFya29yYW5nZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXggPSBjKCJNIiA9ICJhcXVhbWFyaW5lMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiID0gInBpbmsiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQpwaGVhdG1hcCh0KGJldGFfcGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhWywtYygxOjMpXSksCiAgICAgICAgICAgc2NhbGUgPSAicm93IiwKICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLAogICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub19iZXRhX3Jvd19wYWlyZWQsCiAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBiZXRhX2Fubm90YXRpb25fY29sb3JzLAogICAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUsCiAgICAgICAgICAgc2hvd19yb3duYW1lcyA9IFRSVUUsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzID0gImV1Y2xpZGVhbiIsCiAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSAxMCwKICAgICAgICAgY3V0cmVlX2NvbHMgPSA1LAogICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kID0gIndhcmQuRDIiLAogICAgICAgICAgIGNvbG9yID0gY29sb3JSYW1wUGFsZXR0ZShjKCIjNjdhOWNmIiwgIiNmN2Y3ZjciLCAiI2VmOGE2MiIpKSgxNiksCiAgICAgICAgICAgbWFpbiA9ICJIZWF0bWFwIG9mIHNpZ25pZmljYW50IGZlYXR1cmVzIHByZS0gdnMuIHBvc3QtSGlnaC1iZXRhIHBhaXJlZCB0LXRlc3QgXG5zaWcgaW4gQU5PVkEgYWNyb3NzIGFsbCB0cmVhdG1lbnQgZ3JvdXBzIFxuYnkgQmVuamFtb25pLUhvY2hiZXJnIGNvcnJlY3RlZCBwLXZhbHVlcyA+IDAuMDUgXG5CYWNrZ3JvdW5kIGRpZXQgZWZmZWN0IHJlbW92ZWQgXG5MaXBpZG9taWNzIEMxOCAoKykiKQogIApgYGAKCiMjIyMjIFRvbWF0bwoKYGBge3J9CnRvbV9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEgPC0gZGZfZm9yX3N0YXRzX3dpZGUgJT4lCiAgZmlsdGVyKHRyZWF0bWVudCAhPSAiY29udHJvbCIpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlLCBwZXJpb2QsIHRvbWF0b19vcl9jb250cm9sLCBzZXgsCiAgICAgICAgICAgICAgICBhbGxfb2YodG9tX3NpZ19BTk9WQV9vdmVybGFwX3BhaXJlZCRtel9ydCkpICU+JQogIG11dGF0ZV9hdCgicGVyaW9kIiwgYXMuZmFjdG9yKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInNhbXBsZSIpCmBgYAoKYGBge3J9CiMgY3JlYXRlIGFubm90YXRpb24gcm93cyBmb3IgcHJlL3Bvc3QgaW50ZXJ2ZW50aW9ucyBhbmQgd3JhbmdsZQojIHNlbGVjdCByb3duYW1lcyAoc2FtcGxlcykgZnJvbSBoZWF0bWFwIG1ldGFkYXRhIChhbHNvIGVuc3VyZXMgdGhlIG9yZGVyIGlzIGNvcnJlY3QpCmFubm9fdG9tX3Jvd19wYWlyZWQgPC0gYXMuZGF0YS5mcmFtZShyb3duYW1lcyh0b21fcGFpcmVkX3QudGVzdHNfaGVhdG1hcF9kYXRhKSkKCgojIHB1bGwgcGVyaW9kIGludG8gYSBjb2x1bW4KYW5ub190b21fcm93X3BhaXJlZCRwZXJpb2QgPC0gdG9tX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSRwZXJpb2QKYW5ub190b21fcm93X3BhaXJlZCRzZXggPC0gdG9tX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YSRzZXgKCiMgc2VsZWN0IGNvbHMKYW5ub190b21fcm93X3BhaXJlZCA8LSBhbm5vX3RvbV9yb3dfcGFpcmVkICU+JQogIGRwbHlyOjpzZWxlY3QocGVyaW9kLCBzZXgpCgojIGdldCByb3duYW1lcyB0byBtYXRjaCBoZWF0bWFwIGFnYWluCnJvd25hbWVzKGFubm9fdG9tX3Jvd19wYWlyZWQpIDwtIHJvd25hbWVzKHRvbV9wYWlyZWRfdC50ZXN0c19oZWF0bWFwX2RhdGEpCmBgYAoKYGBge3J9CiMgY3JlYXRlIGFubm90YXRpb24gY29sb3JzCnRvbV9hbm5vdGF0aW9uX2NvbG9ycyA8LSBsaXN0KHBlcmlvZCA9IGMoImIxIiA9ICJkYXJrc2FsbW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiMyIgPSAidG9tYXRvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNleCA9IGMoIk0iID0gImFxdWFtYXJpbmUyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIgPSAicGluayIpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTB9CnBoZWF0bWFwKHQodG9tX3BhaXJlZF90LnRlc3RzX2hlYXRtYXBfZGF0YVssLWMoMTozKV0pLAogICAgICAgICAgIHNjYWxlID0gInJvdyIsCiAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gVFJVRSwKICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm9fdG9tX3Jvd19wYWlyZWQsCiAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSB0b21fYW5ub3RhdGlvbl9jb2xvcnMsCiAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSwKICAgICAgICAgICBzaG93X3Jvd25hbWVzID0gVFJVRSwKICAgICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX3Jvd3MgPSAiZXVjbGlkZWFuIiwKICAgICAgICAgICBjbHVzdGVyaW5nX2Rpc3RhbmNlX2NvbHMgPSAiZXVjbGlkZWFuIiwKICAgICAgICAgICBjdXRyZWVfcm93cyA9IDgsCiAgICAgICAgIGN1dHJlZV9jb2xzID0gMiwKICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQyIiwKICAgICAgICAgICBjb2xvciA9IGNvbG9yUmFtcFBhbGV0dGUoYygiIzY3YTljZiIsICIjZjdmN2Y3IiwgIiNlZjhhNjIiKSkoMTYpLAogICAgICAgICAgIG1haW4gPSAiSGVhdG1hcCBvZiBzaWduaWZpY2FudCBmZWF0dXJlcyBwcmUtIHZzLiBwb3N0LVRvbWF0byBwYWlyZWQgdC10ZXN0IFxuc2lnIGluIEFOT1ZBIGFjcm9zcyBhbGwgdHJlYXRtZW50IGdyb3VwcyBcbmJ5IEJlbmphbW9uaS1Ib2NoYmVyZyBjb3JyZWN0ZWQgcC12YWx1ZXMgPiAwLjA1IFxuQmFja2dyb3VuZCBkaWV0IGVmZmVjdCByZW1vdmVkIFxuTGlwaWRvbWljcyBDMTggKCspIikKICAKYGBgCgojIEpvaW5lZCBsaXN0cwoKYGBge3J9CmRmX2Zvcl9zdGF0cyA8LSBkZl9mb3Jfc3RhdHMgJT4lCiAgIyBhZGQgcmVsIGFidW5kIGxldmVscyBiYWNrIHNpbmNlIHRoaXMgZ290IGxvc3QgZHVyaW5nIGRyaWZ0IGNvcnJlY3Rpb24KICBtdXRhdGUocmVsX2FidW5kID0gMl4ocmVsX2FidW5kX2xvZzIpKQpgYGAKCiMjIFVzaW5nIHQgdGVzdHMgc2lnCgojIyMgVG9tYXRvIGVmZmVjdHMKCkhvdyBtYW55IGZlYXR1cmVzIGFyZSBzaWduaWZpY2FudCAod2l0aCBiYWNrZ3JvdW5kIGRpZXQgZWZmZWN0IHJlbW92ZWQpCgpgYGB7cn0KZGltKHNpZ19wYWlyZWRfdG9tX3JtQkcpCmBgYAoKV2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50IGluIHVucGFpcmVkIHQgdGVzdCBjb21wYXJpc29ucz8KCmBgYHtyfQojIHNlbGVjdCBvbmx5IHNpZ25pZmljYW50IGZlYXR1cmVzIGZyb20gcHJlIHYgcG9zdCB0b21hdG8gZWZmZWN0IHRoYXQgaGF2ZSBhIG1hdGNoaW5nIGtleSB0byBzaWduaWZpY2FudCBmZWF0dXJlcyBwb3N0IHRvbWF0byB2LiBwb3N0IGNvbnRyb2wgY29tcGFyaXNvbgoKb3ZlcmFsbF90b21hdG9fZWZmZWN0IDwtIHNlbWlfam9pbihzaWdfcGFpcmVkX3RvbV9ybUJHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ190b21fdl9jdHJsX3QudGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IikKCmRpbShvdmVyYWxsX3RvbWF0b19lZmZlY3QpCmBgYAoKIyMjIyBTdW1tYXJ5IHN0YXRzCgpgYGB7cn0KKEZDX3RvbWF0b19lZmZlY3QgPC0gZGZfZm9yX3N0YXRzICU+JQogIGZpbHRlcihtel9ydCAlaW4lIG92ZXJhbGxfdG9tYXRvX2VmZmVjdCRtel9ydCkgJT4lCiAgc2VsZWN0KHN1YmplY3QsIHRyZWF0bWVudF9wZXJpb2QsIG16X3J0LCByZWxfYWJ1bmQpICU+JQogIGdyb3VwX2J5KG16X3J0KSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdHJlYXRtZW50X3BlcmlvZCwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHJlbF9hYnVuZCkgJT4lCiAgbXV0YXRlKGNvbnRyb2xfRkMgPSBjb250cm9sX2IzL2NvbnRyb2xfYjEsCiAgICAgICAgIGJldGFfRkMgPSBiZXRhX2IzL2JldGFfYjEsCiAgICAgICAgIHJlZF9GQyA9IHJlZF9iMy9yZWRfYjEpICU+JQogIHN1bW1hcml6ZShtZWFuX2NvbnRyb2xfRkMgPSBtZWFuKGNvbnRyb2xfRkMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fYmV0YV9GQyA9IG1lYW4oYmV0YV9GQywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9yZWRfRkMgPSBtZWFuKHJlZF9GQywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9jdHJsX2JldGFfRkMgPSBtZWFuKG1lYW4oYmV0YV9GQywgbmEucm0gPSBUUlVFKS9tZWFuKGNvbnRyb2xfRkMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICBtZWFuX2N0cmxfcmVkX0ZDID0gbWVhbihtZWFuKHJlZF9GQywgbmEucm0gPSBUUlVFKS9tZWFuKGNvbnRyb2xfRkMsIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICBtZWFuX3JlZF9iZXRhX0ZDID0gbWVhbihtZWFuKGJldGFfRkMsIG5hLnJtID0gVFJVRSkvbWVhbihyZWRfRkMsIG5hLnJtID0gVFJVRSkpKSkKYGBgCgojIyMjIENvbXBpbGUgbGlzdAoKYGBge3J9CiMgY29tYmluZSBjbHVzdGVyIGFuZCBGQyBpbmZvCnRvbV9lZmZlY3RfbGlzdCA8LSBsZWZ0X2pvaW4oRkNfdG9tYXRvX2VmZmVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9mZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtel9ydCIpICU+JQogIHNlbGVjdChtel9ydCwgbXosIHJ0LCBDbHVzdGVyX0lELCBDbHVzdGVyX2ZlYXR1cmVzLCBDbHVzdGVyX3NpemUsIGV2ZXJ5dGhpbmcoKSkKCgpgYGAKCmBgYHtyfQojIGFkZCBpbiBhdmVyYWdlcyBmb3IgZWFjaCBncm91cCArIHRpbWVwb2ludAp0b21fZWZmZWN0X2xpc3QgPC0KICBsZWZ0X2pvaW4odG9tX2VmZmVjdF9saXN0LAogICAgICAgICAgICAoZGZfZm9yX3N0YXRzICU+JQogICAgICAgICAgICAgICBncm91cF9ieSh0cmVhdG1lbnRfcGVyaW9kLCBtel9ydCkgJT4lCiAgICAgICAgICAgICAgIHN1bW1hcml6ZShtZWFuX3JlbF9hYnVuZCA9IG1lYW4ocmVsX2FidW5kKSkgJT4lCiAgICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB0cmVhdG1lbnRfcGVyaW9kLCB2YWx1ZXNfZnJvbSA9IG1lYW5fcmVsX2FidW5kKSksCiAgICAgICAgICAgIGJ5ID0gIm16X3J0IikKCmhlYWQodG9tX2VmZmVjdF9saXN0LCBuPTEpCmBgYAoKIyMjIyBFeHBvcnQgbGlzdAoKYGBge3J9CndyaXRlX2Nzdih0b21fZWZmZWN0X2xpc3QsICJlZmZlY3QgbGlzdHMvdG9tYXRvLWVmZmVjdC5jc3YiKQpgYGAKCiMjIyMgQm94cGxvdHMKCmBgYHtyfQojIG1ha2UgY29tcGFyaXNvbiBsaXN0IGZvciBjb21wYXJpc29uIHRlc3RzCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJldGFfYjEiLCAiYmV0YV9iMyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgYygicmVkX2IxIiwgInJlZF9iMyIpLAogICAgICAgICAgICAgICAgICAgICAgICBjKCJjb250cm9sX2IxIiwgImNvbnRyb2xfYjMiKSApCmBgYAoKYGBge3J9CiMgc3Vic2V0IGRmIGZvciB1bmlxdWVseSBzaWduaWZpY2FudCBmZWF0dXJlcwpqdXN0VF90b21fZWZmZWN0X2RmIDwtIGRmX2Zvcl9zdGF0c193aWRlICU+JQogIGRwbHlyOjpzZWxlY3QoYygxOjIxKSwKICAgICAgICAgICAgICAgIChhbGxfb2Yob3ZlcmFsbF90b21hdG9fZWZmZWN0JG16X3J0KSkpCgojIG1ha2UgdGlkeSBkZgpqdXN0VF90b21fZWZmZWN0X2RmX3RpZHkgPC0ganVzdFRfdG9tX2VmZmVjdF9kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IDIyOm5jb2woLiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIm16X3J0IiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInJlbF9hYnVuZF9sb2cyIikKYGBgCgpgYGB7cn0KIyBmaXggZmFjdG9yIGxldmVscyBmb3IgdGltZSBwb2ludHMKanVzdFRfdG9tX2VmZmVjdF9kZl90aWR5JHRyZWF0bWVudF9wZXJpb2QgPC0gZmFjdG9yKGp1c3RUX3RvbV9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnRfcGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb250cm9sX2IxIiwgImNvbnRyb2xfYjMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmV0YV9iMSIsICJiZXRhX2IzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVkX2IxIiwgInJlZF9iMyIpKQoKIyBjaGVjawpsZXZlbHMoanVzdFRfdG9tX2VmZmVjdF9kZl90aWR5JHRyZWF0bWVudF9wZXJpb2QpICAKCmp1c3RUX3RvbV9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnQgPC0gZmFjdG9yKGp1c3RUX3RvbV9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbnRyb2wiLCAiYmV0YSIsICJyZWQiKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTE1fQpqdXN0VF90b21fZWZmZWN0X2RmX3RpZHkgJT4lIAogIGdncGxvdChhZXMoeCA9IHRyZWF0bWVudF9wZXJpb2QsIHkgPSByZWxfYWJ1bmRfbG9nMiwgZmlsbCA9IHRyZWF0bWVudF9wZXJpb2QpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtzZWFncmVlbjIiLCAiZGFya2dyZWVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFuIiwgIm9yYW5nZXJlZDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdmVuZGVyYmx1c2gzIiwgImRhcmtyZWQiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcmUgY29udHJvbCIsICJwb3N0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZSBiZXRhIiwgInBvc3QgYmV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlIGx5YyIsICJwb3N0IGx5YyIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IHN1YmplY3QsIGNvbG91ciA9IHN1YmplY3QpLCBzaXplID0gMC4yKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2FucyIpICsKICBmYWNldF93cmFwKHZhcnMobXpfcnQpLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDQpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ0LnRlc3QiLCBwYWlyZWQgPSBUUlVFLCBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZzIgdHJhbnNmb3JtZWQgcmVsYXRpdmUgYWJ1bmRhbmNlIiwKICAgICAgIHRpdGxlID0gIlRvbWF0byBlZmZlY3QgLSBzaWduaWZpY2FudCB3aGVuIGNvbXBhcmVkIHRvIGNvbnRyb2wsIGFsc28gc2lnbmlmaWNhbnQgcHJlIGFuZCBwb3N0IHRvbWF0byIsCiAgICAgICBzdWJ0aXRsZSA9ICJGRFIgYWRqLiBwLXZhbHVlcyBmcm9tIFQtdGVzdHMiKQogIApgYGAKCiMjIyBCZXRhIGVmZmVjdHMKCmBgYHtyfQpkaW0oc2lnX3BhaXJlZF9iZXRhX3JtQkcpCmBgYAoKV2hpY2ggZmVhdHVyZXMgYXJlIHNpZ25pZmljYW50IGluIHBhaXJlZCB0IHRlc3QgY29tcGFyaXNvbnMgZm9yIGJldGEsIGJ1dCBub3Qgc2lnbmlmaWNhbnQgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGZvciBjb250cm9sPwoKRmVhdHVyZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnQgaW4gYm90aCBwcmUtIHZzLiBwb3N0LiBiZXRhIEFORCBwb3N0LWJldGEgdnMuIHBvc3QtY29udHJvbAoKYGBge3J9CiMgc2VsZWN0IGZlYXR1cmVzIHRoYXQgYXJlIG9ubHkgc2lnbmlmaWNhbnQgcG9zdCBiZXRhIHYuIHBvc3QgY29udHJvbCBjb21wYXJpc29uCm92ZXJhbGxfYmV0YV9lZmZlY3QgPC0gc2VtaV9qb2luKHNpZ19wYWlyZWRfYmV0YV9ybUJHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfYmV0YV92X2N0cmxfdC50ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtel9ydCIpCmRpbShvdmVyYWxsX2JldGFfZWZmZWN0KQpgYGAKCmBgYHtyfQoKb3ZlcmFsbF91bmlxdWVfYmV0YV9lZmZlY3QgPC0gbGVmdF9qb2luKG92ZXJhbGxfYmV0YV9lZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfYmV0YV92X3JlZF90LnRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtel9ydCIpCmRpbShvdmVyYWxsX3VuaXF1ZV9iZXRhX2VmZmVjdCkKYGBgCgojIyMjIFN1bW1hcnkgc3RhdHMKCmBgYHtyfQooRkNfYmV0YV9lZmZlY3QgPC0gZGZfZm9yX3N0YXRzICU+JQogIGZpbHRlcihtel9ydCAlaW4lIG92ZXJhbGxfYmV0YV9lZmZlY3QkbXpfcnQpICU+JQogIHNlbGVjdChzdWJqZWN0LCB0cmVhdG1lbnRfcGVyaW9kLCBtel9ydCwgcmVsX2FidW5kKSAlPiUKICBncm91cF9ieShtel9ydCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHRyZWF0bWVudF9wZXJpb2QsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSByZWxfYWJ1bmQpICU+JQogIG11dGF0ZShjb250cm9sX0ZDID0gY29udHJvbF9iMy9jb250cm9sX2IxLAogICAgICAgICBiZXRhX0ZDID0gYmV0YV9iMy9iZXRhX2IxLAogICAgICAgICByZWRfRkMgPSByZWRfYjMvcmVkX2IxKSAlPiUKICBzdW1tYXJpemUobWVhbl9jb250cm9sX0ZDID0gbWVhbihjb250cm9sX0ZDLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2JldGFfRkMgPSBtZWFuKGJldGFfRkMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fcmVkX0ZDID0gbWVhbihyZWRfRkMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fY3RybF9iZXRhX0ZDID0gbWVhbihtZWFuKGJldGFfRkMsIG5hLnJtID0gVFJVRSkvbWVhbihjb250cm9sX0ZDLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgbWVhbl9jdHJsX3JlZF9GQyA9IG1lYW4obWVhbihyZWRfRkMsIG5hLnJtID0gVFJVRSkvbWVhbihjb250cm9sX0ZDLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgbWVhbl9yZWRfYmV0YV9GQyA9IG1lYW4obWVhbihiZXRhX0ZDLCBuYS5ybSA9IFRSVUUpL21lYW4ocmVkX0ZDLCBuYS5ybSA9IFRSVUUpKSkpCmBgYAoKIyMjIyBDb21waWxlIGxpc3QKCmBgYHtyfQojIGNvbWJpbmUgY2x1c3RlciBhbmQgRkMgaW5mbwpiZXRhX2VmZmVjdF9saXN0IDwtIGxlZnRfam9pbihGQ19iZXRhX2VmZmVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfZmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IikgJT4lCiAgc2VsZWN0KG16X3J0LCBteiwgcnQsIENsdXN0ZXJfSUQsIENsdXN0ZXJfZmVhdHVyZXMsIENsdXN0ZXJfc2l6ZSwgZXZlcnl0aGluZygpKQoKCmBgYAoKYGBge3J9CiMgYWRkIGluIGF2ZXJhZ2VzIGZvciBlYWNoIGdyb3VwICsgdGltZXBvaW50CmJldGFfZWZmZWN0X2xpc3QgPC0KICBsZWZ0X2pvaW4oYmV0YV9lZmZlY3RfbGlzdCwKICAgICAgICAgICAgKGRmX2Zvcl9zdGF0cyAlPiUKICAgICAgICAgICAgICAgZ3JvdXBfYnkodHJlYXRtZW50X3BlcmlvZCwgbXpfcnQpICU+JQogICAgICAgICAgICAgICBzdW1tYXJpemUobWVhbl9yZWxfYWJ1bmQgPSBtZWFuKHJlbF9hYnVuZCkpICU+JQogICAgICAgICAgICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdHJlYXRtZW50X3BlcmlvZCwgdmFsdWVzX2Zyb20gPSBtZWFuX3JlbF9hYnVuZCkpLAogICAgICAgICAgICBieSA9ICJtel9ydCIpCgpoZWFkKGJldGFfZWZmZWN0X2xpc3QsIG49MSkKYGBgCgojIyMjIEV4cG9ydCBsaXN0CgpgYGB7cn0Kd3JpdGVfY3N2KGJldGFfZWZmZWN0X2xpc3QsICJlZmZlY3QgbGlzdHMvYmV0YS1lZmZlY3QuY3N2IikKYGBgCgojIyMjIEJveHBsb3RzCgpgYGB7cn0KIyBzdWJzZXQgZGYgZm9yIHVuaXF1ZWx5IHNpZ25pZmljYW50IGZlYXR1cmVzCmp1c3RUX2JldGFfZWZmZWN0X2RmIDwtIGRmX2Zvcl9zdGF0c193aWRlICU+JQogIGRwbHlyOjpzZWxlY3QoYygxOjIxKSwKICAgICAgICAgICAgICAgIChhbGxfb2Yob3ZlcmFsbF9iZXRhX2VmZmVjdCRtel9ydCkpKQoKIyBtYWtlIHRpZHkgZGYKanVzdFRfYmV0YV9lZmZlY3RfZGZfdGlkeSA8LSBqdXN0VF9iZXRhX2VmZmVjdF9kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IDIyOm5jb2woLiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIm16X3J0IiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInJlbF9hYnVuZF9sb2cyIikKYGBgCgpgYGB7cn0KIyBmaXggZmFjdG9yIGxldmVscyBmb3IgdGltZSBwb2ludHMKanVzdFRfYmV0YV9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnRfcGVyaW9kIDwtIGZhY3RvcihqdXN0VF9iZXRhX2VmZmVjdF9kZl90aWR5JHRyZWF0bWVudF9wZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbnRyb2xfYjEiLCAiY29udHJvbF9iMyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZXRhX2IxIiwgImJldGFfYjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWRfYjEiLCAicmVkX2IzIikpCgojIGNoZWNrCmxldmVscyhqdXN0VF9iZXRhX2VmZmVjdF9kZl90aWR5JHRyZWF0bWVudF9wZXJpb2QpICAKCmp1c3RUX2JldGFfZWZmZWN0X2RmX3RpZHkkdHJlYXRtZW50IDwtIGZhY3RvcihqdXN0VF9iZXRhX2VmZmVjdF9kZl90aWR5JHRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29udHJvbCIsICJiZXRhIiwgInJlZCIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTh9Cmp1c3RUX2JldGFfZWZmZWN0X2RmX3RpZHkgJT4lIAogIGdncGxvdChhZXMoeCA9IHRyZWF0bWVudF9wZXJpb2QsIHkgPSByZWxfYWJ1bmRfbG9nMiwgZmlsbCA9IHRyZWF0bWVudF9wZXJpb2QpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtzZWFncmVlbjIiLCAiZGFya2dyZWVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFuIiwgIm9yYW5nZXJlZDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdmVuZGVyYmx1c2gzIiwgImRhcmtyZWQiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJwcmUgY29udHJvbCIsICJwb3N0IGNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZSBiZXRhIiwgInBvc3QgYmV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlIGx5YyIsICJwb3N0IGx5YyIpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIiLCAiIiwgIiIsICIiLCAiIiwgIiIpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IHN1YmplY3QsIGNvbG91ciA9IHN1YmplY3QpLCBzaXplID0gMC4yKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAic2FucyIpICsKICBmYWNldF93cmFwKHZhcnMobXpfcnQpLCBzY2FsZXMgPSAiZnJlZV95IiwgbnJvdyA9IDMpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIG1ldGhvZCA9ICJ0LnRlc3QiLCBwYWlyZWQgPSBUUlVFLCBwLmFkanVzdC5tZXRob2QgPSAiQkgiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZzIgdHJhbnNmb3JtZWQgcmVsYXRpdmUgYWJ1bmRhbmNlIiwKICAgICAgIHRpdGxlID0gIkhpZ2ggYmV0YSBqdWljZSBlZmZlY3QgLSBzaWduaWZpY2FudCB3aGVuIGNvbXBhcmVkIHRvIGNvbnRyb2wsIGFsc28gc2lnbmlmaWNhbnQgcHJlIGFuZCBwb3N0IGJldGEganVpY2UiLAogICAgICAgc3VidGl0bGUgPSAiRkRSIGFkai4gcC12YWx1ZXMgZnJvbSBULXRlc3RzIikKYGBgCgojIyMgUmVkIGVmZmVjdHMKCmBgYHtyfQpkaW0oc2lnX3BhaXJlZF9yZWRfcm1CRykKYGBgCgpgYGB7cn0KIyBzZWxlY3QgZmVhdHVyZXMgdGhhdCBhcmUgb25seSBzaWduaWZpY2FudCBwb3N0IHJlZCB2LiBwb3N0IGNvbnRyb2wgY29tcGFyaXNvbgoKb3ZlcmFsbF9yZWRfZWZmZWN0IDwtIHNlbWlfam9pbihzaWdfcGFpcmVkX3JlZF9ybUJHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdfcmVkX3ZfY3RybF90LnRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJtel9ydCIpCmRpbShvdmVyYWxsX3JlZF9lZmZlY3QpCmBgYAoKYGBge3J9CiMgc2VsZWN0IGZlYXR1cmVzIHRoYXQgYXJlIG9ubHkgc2lnbmlmaWNhbnQgcG9zdCB0b21hdG8gdi4gcG9zdCBjb250cm9sIGNvbXBhcmlzb24KCm92ZXJhbGxfdW5pcXVlX3JlZF9lZmZlY3QgPC0gbGVmdF9qb2luKG92ZXJhbGxfcmVkX2VmZmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ19iZXRhX3ZfcmVkX3QudGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IikKZGltKG92ZXJhbGxfdW5pcXVlX3JlZF9lZmZlY3QpCmhlYWQob3ZlcmFsbF91bmlxdWVfcmVkX2VmZmVjdCkKYGBgCgojIyMjIFN1bW1hcnkgc3RhdHMKCmBgYHtyfQooRkNfcmVkX2VmZmVjdCA8LSBkZl9mb3Jfc3RhdHMgJT4lCiAgZmlsdGVyKG16X3J0ICVpbiUgb3ZlcmFsbF9yZWRfZWZmZWN0JG16X3J0KSAlPiUKICBzZWxlY3Qoc3ViamVjdCwgdHJlYXRtZW50X3BlcmlvZCwgbXpfcnQsIHJlbF9hYnVuZCkgJT4lCiAgZ3JvdXBfYnkobXpfcnQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB0cmVhdG1lbnRfcGVyaW9kLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gcmVsX2FidW5kKSAlPiUKICBtdXRhdGUoY29udHJvbF9GQyA9IGNvbnRyb2xfYjMvY29udHJvbF9iMSwKICAgICAgICAgYmV0YV9GQyA9IGJldGFfYjMvYmV0YV9iMSwKICAgICAgICAgcmVkX0ZDID0gcmVkX2IzL3JlZF9iMSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fY29udHJvbF9GQyA9IG1lYW4oY29udHJvbF9GQywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9iZXRhX0ZDID0gbWVhbihiZXRhX0ZDLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX3JlZF9GQyA9IG1lYW4ocmVkX0ZDLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2N0cmxfYmV0YV9GQyA9IG1lYW4obWVhbihiZXRhX0ZDLCBuYS5ybSA9IFRSVUUpL21lYW4oY29udHJvbF9GQywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgIG1lYW5fY3RybF9yZWRfRkMgPSBtZWFuKG1lYW4ocmVkX0ZDLCBuYS5ybSA9IFRSVUUpL21lYW4oY29udHJvbF9GQywgbmEucm0gPSBUUlVFKSksCiAgICAgICAgICAgIG1lYW5fcmVkX2JldGFfRkMgPSBtZWFuKG1lYW4oYmV0YV9GQywgbmEucm0gPSBUUlVFKS9tZWFuKHJlZF9GQywgbmEucm0gPSBUUlVFKSkpKQpgYGAKCiMjIyMgQ29tcGlsZSBsaXN0CgpgYGB7cn0KIyBjb21iaW5lIGNsdXN0ZXIgYW5kIEZDIGluZm8KcmVkX2VmZmVjdF9saXN0IDwtIGxlZnRfam9pbihGQ19yZWRfZWZmZWN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2ZlYXR1cmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gIm16X3J0IikgJT4lCiAgc2VsZWN0KG16X3J0LCBteiwgcnQsIENsdXN0ZXJfSUQsIENsdXN0ZXJfZmVhdHVyZXMsIENsdXN0ZXJfc2l6ZSwgZXZlcnl0aGluZygpKQoKCmBgYAoKYGBge3J9CiMgYWRkIGluIGF2ZXJhZ2VzIGZvciBlYWNoIGdyb3VwICsgdGltZXBvaW50CnJlZF9lZmZlY3RfbGlzdCA8LQogIGxlZnRfam9pbihyZWRfZWZmZWN0X2xpc3QsCiAgICAgICAgICAgIChkZl9mb3Jfc3RhdHMgJT4lCiAgICAgICAgICAgICAgIGdyb3VwX2J5KHRyZWF0bWVudF9wZXJpb2QsIG16X3J0KSAlPiUKICAgICAgICAgICAgICAgc3VtbWFyaXplKG1lYW5fcmVsX2FidW5kID0gbWVhbihyZWxfYWJ1bmQpKSAlPiUKICAgICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHRyZWF0bWVudF9wZXJpb2QsIHZhbHVlc19mcm9tID0gbWVhbl9yZWxfYWJ1bmQpKSwKICAgICAgICAgICAgYnkgPSAibXpfcnQiKQoKaGVhZChyZWRfZWZmZWN0X2xpc3QsIG49MSkKYGBgCgojIyMjIEV4cG9ydCBsaXN0CgpgYGB7cn0Kd3JpdGVfY3N2KHJlZF9lZmZlY3RfbGlzdCwgImVmZmVjdCBsaXN0cy9yZWQtZWZmZWN0LmNzdiIpCmBgYAoKIyMjIyBCb3hwbG90cwoKYGBge3J9CiMgc3Vic2V0IGRmIGZvciB1bmlxdWVseSBzaWduaWZpY2FudCBmZWF0dXJlcwpqdXN0VF9yZWRfZWZmZWN0X2RmIDwtIGRmX2Zvcl9zdGF0c193aWRlICU+JQogIGRwbHlyOjpzZWxlY3QoYygxOjIxKSwKICAgICAgICAgICAgICAgIChhbGxfb2Yob3ZlcmFsbF91bmlxdWVfcmVkX2VmZmVjdCRtel9ydCkpKQoKIyBtYWtlIHRpZHkgZGYKanVzdFRfcmVkX2VmZmVjdF9kZl90aWR5IDwtIGp1c3RUX3JlZF9lZmZlY3RfZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyMjpuY29sKC4pLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJtel9ydCIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWxfYWJ1bmRfbG9nMiIpCmBgYAoKYGBge3J9CiMgZml4IGZhY3RvciBsZXZlbHMgZm9yIHRpbWUgcG9pbnRzCmp1c3RUX3JlZF9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnRfcGVyaW9kIDwtIGZhY3RvcihqdXN0VF9yZWRfZWZmZWN0X2RmX3RpZHkkdHJlYXRtZW50X3BlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29udHJvbF9iMSIsICJjb250cm9sX2IzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJldGFfYjEiLCAiYmV0YV9iMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZF9iMSIsICJyZWRfYjMiKSkKCiMgY2hlY2sKbGV2ZWxzKGp1c3RUX3JlZF9lZmZlY3RfZGZfdGlkeSR0cmVhdG1lbnRfcGVyaW9kKSAgCgpqdXN0VF9yZWRfZWZmZWN0X2RmX3RpZHkkdHJlYXRtZW50IDwtIGZhY3RvcihqdXN0VF9yZWRfZWZmZWN0X2RmX3RpZHkkdHJlYXRtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb250cm9sIiwgImJldGEiLCAicmVkIikpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMiwgZmlnLmFzcD0wLjV9Cmp1c3RUX3JlZF9lZmZlY3RfZGZfdGlkeSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdHJlYXRtZW50X3BlcmlvZCwgeSA9IHJlbF9hYnVuZF9sb2cyLCBmaWxsID0gdHJlYXRtZW50X3BlcmlvZCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya3NlYWdyZWVuMiIsICJkYXJrZ3JlZW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YW4iLCAib3JhbmdlcmVkMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF2ZW5kZXJibHVzaDMiLCAiZGFya3JlZCIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInByZSBjb250cm9sIiwgInBvc3QgY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlIGJldGEiLCAicG9zdCBiZXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmUgbHljIiwgInBvc3QgbHljIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIiIsICIiLCAiIiwgIiIsICIiLCAiIikpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3ViamVjdCwgY29sb3VyID0gc3ViamVjdCksIHNpemUgPSAwLjIpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICJzYW5zIikgKwogIGZhY2V0X3dyYXAodmFycyhtel9ydCksIHNjYWxlcyA9ICJmcmVlX3kiKSArIAogIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBtZXRob2QgPSAidC50ZXN0IiwgcGFpcmVkID0gVFJVRSwgcC5hZGp1c3QubWV0aG9kID0gIkJIIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJMb2cyIHRyYW5zZm9ybWVkIHJlbGF0aXZlIGFidW5kYW5jZSIsCiAgICAgICB0aXRsZSA9ICJIaWdoIGx5YyBlZmZlY3QgLSBzaWduaWZpY2FudCB3aGVuIGNvbXBhcmVkIHRvIGNvbnRyb2wsIFxuc2lnbmlmaWNhbnQgcHJlIHZzIHBvc3QgcmVkIiwKICAgICAgIHN1YnRpdGxlID0gIkZEUiBhZGouIHAtdmFsdWVzIGZyb20gVC10ZXN0cyIpCmBgYAoKCiMgRXhwb3J0CgojIyBNZXRhYm9saXRlIGRmCgpgYGB7cn0Kd3JpdGVfY3N2KERDX2ltcF9tZXRhYmluZF9jbHVzdF9sb2cyX25vUUNzLCAiZmluYWwtb21pY3MtZGYtbGlwaWRvbWljcy1uZWcuY3N2Iixjb2xfbmFtZXMgPSBUUlVFKQpgYGAKCg==